Skip to main content

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:
ElementDescription
Goal SelectorSelect the outreach goal: Candidate Placement, Business Development, Speculative Placement, Job Marketing, or Custom. Defaults to your account goal setting.
Recipient NameA 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 ButtonTriggers 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.
The AI settings are collapsed by default to keep the interface clean. Expand them when you want to override your default tone of voice, select a specific pitch deck, or provide extra instructions for the AI to follow when generating your message.

Composing an Email Message

1

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.”
2

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.
3

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.
4

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:
1

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.
2

Copy and Open LinkedIn

Click “Copy & Open” to copy the message to your clipboard and open the contact’s LinkedIn profile in a new tab. You then paste the message directly in LinkedIn’s messaging interface. This approach is used because LinkedIn does not provide an API for sending messages directly.
LinkedIn connection request notes have a strict 300-character limit. Make every word count. Lead with context (“I noticed your team has a Senior Python role open”) and end with a clear reason to connect (“I would love to share some candidate profiles”). The AI generator respects this limit when producing connection request messages.

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:
GoalEmail StyleLinkedIn Style
Candidate PlacementFormal pitch presenting candidates for a specific role. Includes service description from pitch deck.Shorter, more casual version focusing on candidate availability.
Business DevelopmentIntroduction of your recruitment services to a new prospect. Emphasizes your track record and specialization.Brief introduction asking for a connection or conversation.
Speculative PlacementProactive outreach suggesting a candidate without a specific opening. Positions the candidate’s value.Quick message highlighting the candidate’s fit for the company.
Job MarketingPromotion 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:
StatusDescription
DraftMessage has been composed but not yet sent. You can edit and send it later. Drafts are saved automatically.
SentMessage has been successfully dispatched through your email provider or logged as sent via LinkedIn.
FailedSomething went wrong during sending. Check the error details (often an expired OAuth token) and retry.
After a message is sent, additional tracking statuses become available:
Delivery StatusDescription
DeliveredThe email was accepted by the recipient’s mail server. Set automatically 24 hours after sending if no bounce is detected.
BouncedThe email could not be delivered. The bounce reason and timestamp are recorded for your review.
RepliedThe 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)
If multiple contacts are available, they are sorted by priority score, with higher-priority contacts (those more likely to be decision makers) shown first. For job-specific outreach, the hiring manager or team lead is usually the best target. For business development, aim for the HR director or talent acquisition lead.
Priority scores are automatically calculated from job title keywords, but you can manually override them. If you know from experience that a particular contact is the real decision maker (even if their title does not suggest it), set their priority to 90+ to ensure they appear first in your contact selection.

Personalizing Messages

Effective outreach is personalized. Here are techniques that work well within the composer:
  1. Reference the specific role. Mention the job title and one or two key requirements from the description.
  2. Mention the company by name. Show you are reaching out intentionally, not mass-mailing.
  3. Connect to their needs. Reference something specific from the job description that your candidates address.
  4. Use the recipient’s name. “Hi Thomas” is better than “Dear Hiring Manager.”
  5. Keep it relevant. Only include information that matters to the recipient. Skip your company’s 20-year history.
  6. 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.”
  7. 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.
For email messages, tracking data is displayed alongside the message:
Tracked MetricWhat It Shows
Open countHow many times the recipient opened the email
First opened atTimestamp of the first open
Click countHow many times links in the message were clicked
Link URLWhich specific link was clicked
Delivery statusSent, delivered, bounced, or replied
Bounce reasonIf bounced, why the delivery failed
Replied atTimestamp of the reply, if detected
This history is valuable for:
  • 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
Messages sent through Recruitier are real communications sent from your email account. Treat every message as professional correspondence. There is no “unsend” — once dispatched, the message is in the recipient’s inbox.

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 a Message entity with the following key fields:
FieldTypeDescription
idUUIDUnique identifier for the message
channelEnumEMAIL or LINKEDIN_MESSAGE
statusEnumDRAFT, SENT, or FAILED
tracking_idUUIDUnique ID used for open/click tracking
open_countIntegerNumber of times the email was opened
click_countIntegerNumber of times links were clicked
first_opened_atTimestampWhen the email was first opened
delivery_statusStringsent, delivered, bounced, or replied
bounced_atTimestampWhen the bounce was detected
bounce_reasonStringWhy the delivery failed
replied_atTimestampWhen the reply was detected
The 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:
  1. 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.
  2. 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.
  3. 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.
  4. Model invocation: The assembled prompt is sent to Google Vertex AI via the AIModelAdapter interface.
  5. Response handling: The generated text is returned as a draft in the composer for your review and editing.
  6. 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:
  1. 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=0 to be completely invisible.
  2. 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}.
  3. Sending: The email is dispatched via the Gmail API or Microsoft Graph API.
  4. Open detection: When the recipient’s email client loads images, the pixel request hits /t/o/{tracking_id}. The server increments open_count and sets first_opened_at if not already set.
  5. Click detection: When the recipient clicks a wrapped link, the request hits /t/c/{tracking_id}. The server increments click_count, logs the link_url, and redirects to the original URL.
  6. Delivery monitoring: A CronJob periodically checks sent messages. Messages older than 24 hours without a bounce are marked as delivered. Bounced messages have their bounced_at and bounce_reason recorded.
  7. Reply detection: The system monitors for replies to tracked messages and updates delivery_status to replied with the replied_at timestamp.

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 messages
  • default_linkedin_tone_id — the tone of voice used by default when generating LinkedIn messages
  • default_email_pitch_deck_id — the pitch deck used by default for email generation
  • default_linkedin_pitch_deck_id — the pitch deck used by default for LinkedIn generation
These defaults pre-populate the selectors in the composer, saving you from choosing the same settings every time. You can override them on a per-message basis by selecting a different tone or pitch deck in the composer before generating.

Edge Cases and Special Behaviors

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.
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.
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.
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.