What Is the Message Composer?
The message composer is a modal dialog you use to write, preview, and send outreach messages within Recruitier. You can open it from a job detail page by clicking on a contact, or from a company page. The composer opens with relevant context pre-loaded — job details, company information, and contact data — giving you everything you need to craft a targeted, personalized message. The composer supports both email and LinkedIn channels, with a toggle at the top to switch between them. For email, you get a subject line field, a message body area, and your signature preview. For LinkedIn, you get a streamlined plain text editor with a character counter optimized for shorter messages.The message composer is available from two contexts: job detail pages (for job-specific outreach) and company pages (for business development outreach). The composer modal adapts to the context, loading the relevant job or company information for AI message generation.
The Composer Interface
When you open the message composer, you will see the following elements:Channel Toggle
Two buttons at the top right of the dialog let you switch between Email and LinkedIn. The available channels depend on the contact type: email contacts can only use the Email channel, and LinkedIn contacts can only use the LinkedIn channel. The toggle is disabled for channels not available for the selected contact.
Recipient and Subject
The “To” field shows the recipient’s email address or LinkedIn URL. For email, a subject line input field appears next to it. Recruitier auto-generates a default subject line based on the company name, which you can edit.
Message Body
The main text area where you write your message. This is a plain text area for both email and LinkedIn. For LinkedIn, a character counter appears below the text area, warning you when approaching the 300-character limit for connection request notes.
Email Signature Preview
When composing an email, if you have a connected email account with a signature, it appears below the message body in a separate section labeled with your provider name (Gmail or Outlook). The signature is automatically appended to sent emails.
AI Generation Section
Below the message body, an AI generation panel provides the following controls:| Element | Description |
|---|---|
| Goal Selector | Select the outreach goal: Candidate Placement, Business Development, Speculative Placement, Job Marketing, or Custom. Defaults to your account goal setting. |
| Recipient Name | A text input for the recipient’s name, used by the AI to personalize the greeting. Pre-filled from the contact details. |
| Language Toggle (NL/EN) | A switch to choose between Dutch and English for AI-generated messages. |
| Generate Button | Triggers AI-assisted message generation. For email, this appears inline next to the other fields. For LinkedIn, it appears as a full-width button. |
| AI Settings (Collapsed) | Click “Show AI Settings” to expand additional options: Tone of Voice selector, Pitch Deck selector, and Extra Instructions text area. Tone and pitch deck default to your profile’s defaults for the selected channel. |
Composing an Email Message
Review the Subject Line
A default subject line is auto-generated based on the company name. Review it and adjust as needed. Good subject lines are specific and concise. “Regarding your Senior Developer role in Amsterdam” is far more effective than “Recruitment inquiry.”
Write or Generate the Body
You can write your message manually in the text area, or use the AI Generate button to create a draft. To use AI generation, first enter the recipient’s name, select your outreach goal, and choose the language (NL or EN). For more control, expand “AI Settings” to select a specific tone of voice and pitch deck. The AI produces a contextual draft that you can then edit, personalize, and refine.
Review Your Signature
If you have a connected email account with a signature, it appears below the message body in a preview panel. The signature is labeled with your provider name (e.g., “Gmail signature” or “Outlook signature”) and is automatically appended when sending. You do not need to add it to your message manually.
Send, Save as Draft, or Cancel
The footer of the composer provides three options:
- Send — Dispatches the email immediately through your connected email account. The modal closes optimistically and you receive a toast notification when the email is delivered.
- Draft — Creates a draft in your connected email account. The modal closes and you receive a confirmation toast.
- Cancel — Closes the composer without sending.
Composing a LinkedIn Message
LinkedIn messages follow a simpler format:Write or Generate the Message
LinkedIn messages are plain text and should be shorter than email. Aim for 2-4 sentences for connection request notes and 3-6 sentences for direct messages. A character counter below the message shows your current length and warns when you exceed 300 characters. If using AI generation, the model automatically adjusts for LinkedIn’s more casual, concise format.
AI-Assisted Message Generation
Recruitier uses Google Vertex AI to generate message drafts, incorporating the full context of the job, company, and your configured tone of voice and pitch deck. AI-generated messages serve as a starting point that you refine and personalize before sending.What the AI Considers
When generating a message, the AI receives and processes:- Job details — title, description, requirements, location, experience level, flexibility
- Company information — name, industry, size, LinkedIn profile
- Recipient details — name and role of the person you are contacting
- Tone of voice — your selected communication style template (injected as instructions)
- Pitch deck — your service description and value proposition (injected as context)
- Channel — adapts length and format for email vs. LinkedIn (LinkedIn messages are shorter and more casual)
- Outreach goal — determines which template structure to use
- Your name and language — personalizes the sender identity and generates in the correct language
Outreach Goal Templates
The AI uses different templates based on your selected goal:| Goal | Email Style | LinkedIn Style |
|---|---|---|
| Candidate Placement | Formal pitch presenting candidates for a specific role. Includes service description from pitch deck. | Shorter, more casual version focusing on candidate availability. |
| Business Development | Introduction of your recruitment services to a new prospect. Emphasizes your track record and specialization. | Brief introduction asking for a connection or conversation. |
| Speculative Placement | Proactive outreach suggesting a candidate without a specific opening. Positions the candidate’s value. | Quick message highlighting the candidate’s fit for the company. |
| Job Marketing | Promotion of a job opportunity to potential candidates. Sells the role and the company. | Direct message about an exciting opportunity. |
AI-generated messages are drafts, not final copy. Always review, personalize, and adjust before sending. The best outreach messages combine AI efficiency with your personal knowledge of the market and the specific opportunity. Each generation costs 1 AI credit — trial users have these deducted from their balance.
Company Outreach Templates
For company flows (not tied to a specific job), the AI uses separate company outreach templates that do not reference a specific role. These are useful for general business development outreach where you want to introduce your services to a company without tying the conversation to a particular vacancy.Message Statuses
Every message in Recruitier has a status that reflects its lifecycle:| Status | Description |
|---|---|
| Draft | Message has been composed but not yet sent. You can edit and send it later. Drafts are saved automatically. |
| Sent | Message has been successfully dispatched through your email provider or logged as sent via LinkedIn. |
| Failed | Something went wrong during sending. Check the error details (often an expired OAuth token) and retry. |
| Delivery Status | Description |
|---|---|
| Delivered | The email was accepted by the recipient’s mail server. Set automatically 24 hours after sending if no bounce is detected. |
| Bounced | The email could not be delivered. The bounce reason and timestamp are recorded for your review. |
| Replied | The recipient has responded to your message. Detected automatically and timestamped. |
Each message is assigned a unique
tracking_id (UUID) that links all tracking events (opens, clicks, bounces, replies) back to the specific message. This ID is embedded in the tracking pixel and link wrappers.Selecting Contacts
When composing a message, you select a recipient from the contact details available for the job or company. Recruitier gathers contact information from several sources:- Job descriptions — email addresses and names mentioned in the posting
- Company LinkedIn profiles — decision maker names and titles
- Previously saved data — contacts you have manually added or imported from past interactions
- Data enrichment — contact details discovered through Recruitier’s research tools (Bright Data integration)
Personalizing Messages
Effective outreach is personalized. Here are techniques that work well within the composer:- Reference the specific role. Mention the job title and one or two key requirements from the description.
- Mention the company by name. Show you are reaching out intentionally, not mass-mailing.
- Connect to their needs. Reference something specific from the job description that your candidates address.
- Use the recipient’s name. “Hi Thomas” is better than “Dear Hiring Manager.”
- Keep it relevant. Only include information that matters to the recipient. Skip your company’s 20-year history.
- End with a clear call to action. “Are you available for a 15-minute call this week?” is better than “Let me know if you are interested.”
- Match the channel. Emails can be 3-7 sentences. LinkedIn messages should be 2-4 sentences. LinkedIn connection notes must be under 300 characters.
Message History and Tracking
Recruitier maintains a complete history of all messages sent through the outreach system:- Per job — see every message sent in connection with a specific job.
- Per company — view all communication history with a company.
- Per flow — each outreach flow shows its associated messages linked to the corresponding steps.
- Per user — your personal message log tracks everything you have sent.
| Tracked Metric | What It Shows |
|---|---|
| Open count | How many times the recipient opened the email |
| First opened at | Timestamp of the first open |
| Click count | How many times links in the message were clicked |
| Link URL | Which specific link was clicked |
| Delivery status | Sent, delivered, bounced, or replied |
| Bounce reason | If bounced, why the delivery failed |
| Replied at | Timestamp of the reply, if detected |
- Picking up conversations where you left off
- Avoiding duplicate outreach to the same contact
- Reviewing what messaging approaches have worked best
- Providing context to team members who may take over an opportunity
Best Practices
- Shorter is better. The ideal first-touch email is 3-5 sentences. Save the details for a follow-up or call.
- Proofread before sending. Typos and errors undermine your credibility. Take 30 seconds to re-read, even if the AI generated the message.
- Use the context panel. The job and company details are right there — reference them to make your message stand out.
- Match the channel to the message. Detailed pitches go in email. Quick follow-ups work better on LinkedIn.
- Track your results. Review open rates and reply rates to learn which approaches work best for your market.
- Select the right AI goal. Candidate placement, business development, speculative placement, and job marketing all produce different message structures. Choosing the wrong goal produces an off-target message.
Advanced
How the Message Entity Is Structured
Each message is stored as aMessage entity with the following key fields:
| Field | Type | Description |
|---|---|---|
id | UUID | Unique identifier for the message |
channel | Enum | EMAIL or LINKEDIN_MESSAGE |
status | Enum | DRAFT, SENT, or FAILED |
tracking_id | UUID | Unique ID used for open/click tracking |
open_count | Integer | Number of times the email was opened |
click_count | Integer | Number of times links were clicked |
first_opened_at | Timestamp | When the email was first opened |
delivery_status | String | sent, delivered, bounced, or replied |
bounced_at | Timestamp | When the bounce was detected |
bounce_reason | String | Why the delivery failed |
replied_at | Timestamp | When the reply was detected |
tracking_id is the key that connects all tracking events to a specific message. It is embedded in the tracking pixel URL (/t/o/{tracking_id}) and in wrapped link URLs (/t/c/{tracking_id}?url={original_url}).
How AI Message Generation Works Technically
The AI generation pipeline follows these steps:- Context assembly: The system gathers all available context — job details, company info, recipient name, user name, language, selected tone, selected pitch deck, and the outreach goal.
- Template selection: Based on the goal (candidate placement, business development, speculative placement, or job marketing) and channel (email or LinkedIn), the appropriate prompt template is selected. There are 4 email templates and 4 corresponding LinkedIn templates, plus company-specific variants.
- Prompt construction: The template is populated with context. The tone of voice is injected as:
"Tone of Voice Instructions:\n- {content}". The pitch deck is injected as:"Pitch Deck:\n- {content}". Signature instructions are included to avoid duplicate closings. - Model invocation: The assembled prompt is sent to Google Vertex AI via the
AIModelAdapterinterface. - Response handling: The generated text is returned as a draft in the composer for your review and editing.
- Credit deduction: 1 AI credit is deducted from the user’s balance. For trial users, this reduces their credit count. The credit is consumed at generation time, regardless of whether the message is ultimately sent.
How Email Tracking Works End-to-End
When an email is sent through the composer:- Pixel injection: An invisible 1x1 GIF tracking pixel is added to the email HTML. It is styled as
width=1, height=1, border=0, visibility=hidden, opacity=0to be completely invisible. - Link wrapping: Every link in the message body (not the signature) is rewritten to pass through Recruitier’s tracking redirect:
/t/c/{tracking_id}?url={encoded_original_url}. - Sending: The email is dispatched via the Gmail API or Microsoft Graph API.
- Open detection: When the recipient’s email client loads images, the pixel request hits
/t/o/{tracking_id}. The server incrementsopen_countand setsfirst_opened_atif not already set. - Click detection: When the recipient clicks a wrapped link, the request hits
/t/c/{tracking_id}. The server incrementsclick_count, logs thelink_url, and redirects to the original URL. - Delivery monitoring: A CronJob periodically checks sent messages. Messages older than 24 hours without a bounce are marked as
delivered. Bounced messages have theirbounced_atandbounce_reasonrecorded. - Reply detection: The system monitors for replies to tracked messages and updates
delivery_statustorepliedwith thereplied_attimestamp.
How Default Tones and Pitch Decks Work
Your user profile stores four default settings:default_email_tone_id— the tone of voice used by default when generating email messagesdefault_linkedin_tone_id— the tone of voice used by default when generating LinkedIn messagesdefault_email_pitch_deck_id— the pitch deck used by default for email generationdefault_linkedin_pitch_deck_id— the pitch deck used by default for LinkedIn generation
Edge Cases and Special Behaviors
What happens when a send fails
What happens when a send fails
If the email send fails (expired token, provider error, etc.), the message status is set to
FAILED and the error details are recorded. The outreach step is NOT marked as complete. You can fix the issue (reconnect your email, for example) and retry the send. The message retains its content — you do not need to rewrite it.Draft messages and step completion
Draft messages and step completion
A message can exist in
DRAFT status without the step being completed. You can compose and save a draft, close the composer, and return later to review and send. The step only moves to “completed” when the message is actually sent. Drafts do not trigger candidate pipeline updates.Messages for non-email channels
Messages for non-email channels
For LinkedIn messages and phone calls, the “message” stored in Recruitier serves as a record of what you sent or discussed, rather than the actual transmitted message. LinkedIn messages are composed in Recruitier but may require action in your LinkedIn browser tab. Phone calls are logged as notes describing the conversation.
Handling bounced emails
Handling bounced emails
When a bounce is detected, the message’s
delivery_status changes to bounced and the bounce_reason is recorded. Common reasons include invalid email address, full mailbox, or domain not found. The outreach step remains marked as complete (you did attempt the contact), but you should review the bounce reason and consider reaching out through a different channel or updating the contact’s email address.
