# Affiliate Program
Source: https://help.scribe-mail.com/en/affiliate-program
Earn 30% recurring commission for 12 months by referring new customers to Scribe. Your referrals get an automatic 30% discount at checkout.
The Scribe Affiliate Program lets you earn money by recommending Scribe to people in your network. For every new customer you refer, you earn a 30% commission on their subscription for up to 12 months. Your referrals also get a [30% discount automatically applied at checkout](/en/pricing).
There is no cap on how much you can earn. The more customers you refer, the more you make.
## How it works
The affiliate program follows four simple steps.
If you already have a Scribe account, go to **Refer and earn** in your Scribe sidebar and click **Sign up**. Fill in your first name, last name, and email, then agree to the terms and conditions. Once submitted, you are officially part of the program.
If you do not have a Scribe account and prefer not to create one, you can also sign up directly through our affiliate platform at [scribe-2.getrewardful.com/signup](https://scribe-2.getrewardful.com/signup).
After signing up, you will see your unique referral link on the Overview tab. Click **Copy link** to copy it and share it with your audience, clients, or network.
When someone clicks your link and signs up for Scribe, they appear as a lead in your dashboard. If they upgrade to a [paid plan](/en/plans) within 90 days, you earn a 30% commission on their subscription for 12 months. They also receive a 30% discount for 12 months.
Connect your payout method to receive your commissions automatically. Payouts are processed monthly once your balance reaches \$200 or more.
## Your affiliate dashboard
Once you join the program, you can access your affiliate dashboard from the **Refer and earn** section in the Scribe sidebar. The dashboard has four tabs: Overview, Earnings, FAQ, and ROI Calculator.
### Overview
The Overview tab gives you a snapshot of your affiliate activity and earnings.
**Activity** shows three metrics that help you understand how your referral link is performing. **Clicks** is the total number of unique clicks your link has received. **Leads** is the total number of signups that came from your link. **Sales** is the total number of leads that converted to a paid account.
**Earnings** shows your financial progress. **Payout threshold** tracks your current earnings toward the \$200 minimum required for payout. **Paid** shows the total amount already paid out to you. **Total** shows your total lifetime earnings from the affiliate program, including paid and pending amounts.
### Earnings
The Earnings tab shows a detailed table of all your referral transactions. Each row includes the customer email, the date of the transaction, the subscription amount, your commission earnings, and the current status.
Transactions can have one of three statuses: **Pending** means the commission is waiting to be processed, **Processed** means it has been approved and is ready for payout, and **Paid** means the funds have been transferred to your account.
### FAQ
The FAQ tab answers the most common questions about the affiliate program directly inside the dashboard. You can expand each question to read the full answer.
### ROI Calculator
The ROI Calculator helps you estimate your potential earnings. Enter the number of employees your client needs signatures for, and the calculator will show the yearly cost for your client (with the 30% discount applied) and the yearly revenue you would earn from the 30% commission.
## Connect your payout method
To receive your commissions, you need to connect a payout method. Click **Connect payout** on the Overview tab and fill in the required information.
You will need to provide your company name, tax ID, full business address (street, house number, postal code, city, and country), and your payout details. You can choose to receive payments through PayPal or a bank account number.
Once your payout method is connected, commissions will be transferred automatically each month when your balance reaches the \$200 minimum.
## Commission details
**30% commission for 12 months.** You earn a 30% commission on all subscriptions for the first 12 months for each paying customer you refer. There is no cap on earnings, so you can refer as many customers as you like.
**90-day conversion window.** Customers you refer will initially register for the free plan. If they upgrade to a paid plan within 90 days of their initial registration, that subscription will be credited to you. Attribution is based on last click, so your link must be the last one clicked before the customer signs up for Scribe.
**30% discount for your referrals.** Your referred customers also benefit from the program. They receive a 30% discount automatically applied at checkout for their first 12 months.
**Monthly payouts.** Commission payouts are processed monthly, typically on the 1st. Payments are made when the total accrued commission reaches \$200 or more.
## How to promote the program
Share your unique referral link with your audience through your preferred channels. When you post or distribute content about Scribe, your message must make it clear that you have a financially compensated relationship with Scribe. All promotions need to be FTC compliant.
## Business registration requirement
Anyone participating in the affiliate program must be registered as a business or as a self-employed professional. You will need to provide a valid business registration number to comply with legal requirements. For affiliates based in France, this means providing your SIREN number. For affiliates in other countries, the equivalent registration number in your jurisdiction is required. Without this number, no payment can be processed.
## Terms and conditions
By joining the Scribe Affiliate Program, you agree to the following rules.
Self-referrals are not allowed. You cannot sign up for Scribe through your own affiliate link.
Abuse, gaming, or attempting to mislead (for example, posting fake discounts to coupon sharing websites) will result in your account being permanently banned.
You may not run search engine ads on branded terms or domain names, Facebook ads, or other paid ads that would compete with Scribe marketing efforts and cause potential confusion for customers.
You may not run Facebook ads that link to the Scribe website or do anything similar that would compete with Scribe paid marketing, drive up costs, or cause confusion.
You may not pretend to be acting on behalf of Scribe or present yourself as a Scribe employee.
Scribe reserves the right to change the terms of service for the affiliate program at any time.
Scribe reserves the right to terminate your affiliate account for violation of any of the rules at its sole discretion. Commissions generated by mechanisms that violate the terms of service will not be paid or owed.
## Need help?
If you have any questions about the affiliate program, feel free to email us at [hello@scribe-mail.com](mailto:hello@scribe-mail.com) or reach out through the customer service chat on the [Scribe website](https://www.scribe-mail.com).
## Related articles
* [Pricing](/en/pricing): the per-user pricing and discounts your referrals receive.
* [Plans](/en/plans): the Free, Business, and Enterprise tiers customers choose from.
* [Do I need Scribe?](/en/do-i-need-scribe): the value story to share with the people you refer.
# Scribe email signature compatibility with email clients
Source: https://help.scribe-mail.com/en/are-scribe-email-signatures-compatible-with-all-email-clients
Yes. Scribe signatures are engineered to render correctly across all email clients, browsers, and devices, including Gmail, Outlook, Apple Mail, and more.
Yes. Scribe email signatures are built to display correctly across all major email clients, browsers, and devices. Every signature is responsive and optimized to handle the rendering differences between email platforms, so your team's signatures look consistent everywhere.
## Why email signature rendering is hard
Email clients don't follow the same rules as web browsers. Each one interprets HTML and CSS differently, which means a signature that looks perfect in Gmail can break in Outlook, or vice versa. Here are the main challenges Scribe solves behind the scenes:
**HTML and CSS inconsistencies**
Email clients have wildly different levels of HTML and CSS support. Some strip out styling elements entirely, others interpret them in unexpected ways. Scribe generates inline-styled, table-based HTML that works reliably across all clients, even the most restrictive ones.
**Image rendering**
Some email clients block images by default, others have trouble with certain formats or break image alignment. Scribe optimizes image handling so signatures degrade gracefully when images are blocked, and display correctly when they're loaded.
**Font compatibility**
Most email clients don't support custom web fonts and fall back to system fonts, which can break your brand's typography. Scribe uses a carefully selected set of fonts that render consistently, with appropriate fallbacks built in.
**Mobile responsiveness**
Email signatures need to adapt across screen sizes, but email clients offer far less CSS support than web browsers. Scribe signatures are responsive by default, adjusting layout and sizing for mobile without relying on unsupported CSS features.
**Spacing and alignment**
Line height, padding, and vertical spacing are interpreted differently across clients. Scribe normalizes these so your signature maintains consistent alignment everywhere, from Gmail on Chrome to Outlook on Windows.
## What this means for you
You don't need to think about any of this. Scribe handles the technical complexity so your signatures just work, no matter which email client your teammates or their recipients use.
This applies to both [client-side and server-side](/en/do-scribe-email-signatures-work-on-mobile) installation methods. Regardless of how signatures are deployed, Scribe ensures cross-client compatibility.
# Ask AI
Source: https://help.scribe-mail.com/en/ask-ai
Ask AI is the assistant built into Scribe: what it can do, who can use it, what it never does, its limits, what happens to your conversations, and how to report a problem.
Ask AI is the assistant built into the Scribe web app. Ask it a question about Scribe, describe the signature you want, or ask it to make a change in your workspace. It answers from this help center and from your workspace's data, in the language you write in, and it asks before it changes anything.
Ask AI is powered by Claude, a model made by Anthropic. Like any AI, it can be wrong: the line under the message field says so, "AI can be wrong. Check before you publish."
## Where to find Ask AI
* **The Ask AI button** sits in the bottom-right corner of every page once you're signed in. It opens a panel docked on the right of the screen, which goes full width on a narrow window.
* **The keyboard shortcut** is **⌘J** on Mac and **Ctrl+J** on Windows. It opens the panel, or brings you back to its message field. **Esc** closes the panel.
* **In the signature editor**, the Ask AI button sits next to the properties sidebar.
* **On the Smart Fields page**, an **Ask AI** button starts a conversation about smart fields.
The button is hidden while you're onboarding, checking out, or choosing a plan. Those pages show the support chat instead.
Ask AI can also open by itself, at most once a week, when it has a suggestion for your workspace. If you close it, it stays quiet for 30 days. To stop it, turn off **Open Ask AI by itself when something is worth doing** in the panel.
## What can Ask AI do?
| You ask | What Ask AI does |
| - | - |
| A question about Scribe | Answers from the help center and links the page it used |
| A question about your workspace | Reads your signatures, teammates, smart fields, folders, media library, campaigns, integrations, and analytics, then answers |
| A change in your workspace | Prepares the change and asks you to approve it before it happens |
| "Take me there" | Opens the right page, or the right section of your settings |
| A signature, in the editor | Builds it from a description, a screenshot, or pasted HTML, and edits it as you ask |
| Help from a person | Writes a message to our support team for you to send |
### Changes ask first
Outside the editor, every change shows an approval card that says in plain words what will happen, for example "Publish the signature Sales 2026 to 14 mailboxes". Nothing changes until you click **Yes, do it**. Click **No** and Ask AI doesn't try that change again in the conversation.
Ask AI can, with your approval:
* Create, edit, duplicate, and delete signatures and their variants
* Choose who gets a signature, then publish and install it. The card names how many mailboxes it reaches.
* Add and edit teammates, and sync them from your directory
* Create and edit smart fields, folders, and media library images
* Create, edit, schedule, pause, and resume campaigns that don't email your teammates
**What Ask AI changed**, at the top of the panel, lists the changes it made in the conversation, the latest first.
### In the signature editor
In the [editor](/en/editor/editor-overview), Ask AI changes the draft in front of you as you watch, so there is no approval card: every change can be undone with **Undo**. Start from one of its suggestions, **Describe the signature you want**, **Build it from a screenshot**, or **Rebuild it from pasted HTML**, or write your own request. Ask AI never publishes from the editor: you publish when the design is right.
### Help from our support team
Ask for a person, ask about billing or a legal matter, or let Ask AI fail twice at the same question, and it hands you over to our support team. It writes a short message summing up the conversation and opens the support chat with it, so you don't have to explain again. You read the message and send it yourself.
## Who can use Ask AI?
Ask AI is for the **Owners and Admins** of a workspace. People with the **Member** role don't see the button. See [Members](/en/members) for what each role can do.
If Ask AI can't open, the panel tells you why:
| Message | What it means |
| - | - |
| "Ask AI is for the workspace's owners and admins." | Your role in this workspace is Member. |
| "Ask AI is not available in this workspace." | Ask AI isn't turned on for this workspace. |
| "Ask AI is down for maintenance. Try again later." | Ask AI is paused for everyone for a short while. |
| "You are offline. Ask AI reconnects once you are back." | Your connection dropped. The conversation picks up when it's back. |
## What does Ask AI never do?
Some actions stay with you, whatever you ask. Ask AI never:
* Changes your billing or your plan
* Deletes your workspace
* Manages the workspace's members or their roles
* Sets up SSO or domains
* Sends invitations or notifications to your teammates, including campaigns that email them
* Deletes in bulk
When you ask for one of these, Ask AI says it doesn't do it, then takes you to the page where you can do it yourself, or hands you over to our support team.
It also doesn't show your invoices (it opens your billing settings instead), and it doesn't connect integrations for you: it opens the integration so you can connect it yourself. Text inside the pages, signatures, or HTML it reads is treated as content, never as instructions to follow.
## What are Ask AI's limits?
| Limit | Value |
| - | - |
| Conversations per person | 30 a day. A conversation counts once, when you send its first message. |
| Use per workspace | A monthly limit, shared by everyone in the workspace |
| Images | Up to 4 per message, JPEG, PNG, or GIF, 5 MB each |
| Pasted HTML | One block per message, up to 60 KB once cleaned up |
| Where it works | The Scribe web app. Not the desktop app or the Outlook add-in. |
| Languages | Answers in the language you write in. The help center is searched in its 13 languages. |
When you reach a limit, the panel tells you when Ask AI opens again. Days and months reset at 00:00 UTC.
The panel keeps your latest conversation in this browser. There is no list of past conversations, and another browser or computer starts a new one.
## What happens to your conversations?
* **What Ask AI uses.** Your messages, the images and HTML you add, the page you're on, the workspace data it reads to answer you or to make a change, and its answers.
* **Who sees them.** A conversation is private to you, in the workspace where you started it. Other members of the workspace can't open it.
* **Who processes them.** Answers are written by Anthropic's Claude model. Anthropic is one of our [subprocessors](/en/security/subprocessors) and doesn't use your conversations to train its models. Neither do we.
* **How long they're kept.** A conversation and its images are deleted 90 days after its last message. Images you saved to your media library stay there. We also keep a record of each exchange to watch quality, cost, and errors: its content is deleted after 30 days.
* **How to delete one now.** Click **Delete conversation** (the trash icon) at the top of the panel. The conversation and its images are deleted at once.
* **How we use them.** To provide Ask AI, fix problems, and improve Scribe and Ask AI. Our team may read conversations for that purpose. Personal information is removed before any excerpt is shared in our internal tools.
**New conversation** starts a new conversation but doesn't delete the previous one, which is then deleted after 90 days. To remove a conversation right away, click **Delete conversation** first.
To ask us to stop processing your information with Ask AI, email [privacy@scribe-mail.com](mailto:privacy@scribe-mail.com). Our [privacy policy](https://www.scribe-mail.com/privacy) has the full details.
## How do I report a problem?
* **Rate an answer.** Under each answer, click the thumbs up (**Good answer**) or the thumbs down (**Bad answer**).
* **Report a problem.** Under an answer, click **Report a problem**, describe what went wrong, and click **Send**. Your report reaches our team with a reference to the conversation, so you don't have to copy it.
* **Tell Ask AI.** Say something doesn't work. Ask AI asks a few questions about what happened and offers to send a report to our team. It sends nothing unless you say yes.
* **Talk to a person.** Ask for one, and Ask AI prepares a message for our support team. You can also click **Message Support** in the **Get Support** menu at any time.
If an answer fails, the panel shows "The answer could not be completed." with three buttons: **Retry**, **Help Center**, and **Message Support**.
## Related articles
* [Members](/en/members): the roles that decide who can use Ask AI.
* [Editor overview](/en/editor/editor-overview): the editor where Ask AI builds your signatures.
* [Subprocessors](/en/security/subprocessors): the companies that process data for Scribe, Anthropic included.
* [Scribe MCP server](/en/ai-agents): connect your own AI assistant, like Claude or ChatGPT, to Scribe.
# Assign teammates to a signature
Source: https://help.scribe-mail.com/en/assign-teammates-to-a-signature
Select which teammates use a signature: individually, by group, by administrative unit, or dynamically using Smart Field conditions.
From the [signature detail page](/en/signature-detail-page), click the **Teammates** tab to see which teammates are assigned to this signature and manage the assignment.
## Teammates table
The table lists every teammate assigned to the signature with the following columns:
* **Name**: Teammate name and email. A small arrow expands the row to reveal aliases and detailed installation info per email address.
* **Information**: A progress bar showing how complete their Smart Field profile is (e.g., 100%, 60%). A lower percentage means more blocks will be [left out of their signature](/en/smart-fields#what-happens-when-a-smart-field-is-empty).
* **Integrations**: Which email provider is connected (for example Google Workspace, Microsoft 365 or Zoho Mail)
* **Installations**: Current [installation status](/en/signature-installation-statuses-and-errors) for this teammate (Installed, Pending, Not installed, Failed)
* **Actions**: Edit teammate profile (pencil icon) or Preview their signature (eye icon)
Click the arrow next to a teammate's name to expand their row and see installation details per email address, including aliases. Each row shows the email, platform (Web, Desktop, Mobile), integration, date, and status.
## Assign teammates
Click **Edit Teammates Selection** in the top-right corner to open the **Select Teammates** modal. The left panel lets you pick teammates, and the right panel shows who's currently selected.
You can assign teammates using four methods, each available as a tab:
**Teammates**: Browse and select individual teammates from your full list. Check the box next to each name to add them. Use the search bar to find specific people.
**Groups**: Select an entire group at once (e.g., "Sales", "Engineering"). All teammates in that group are added. Each group shows how many teammates it contains.
**Administrative Units**: Similar to groups, but based on organizational structure from your identity provider. Select an administrative unit to add all teammates within it.
**Smart Fields**: Build dynamic conditions using [Smart Field values](/en/smart-fields) to automatically match teammates. For example: *"If Microsoft 365 department is any of Sales, Sales & Marketing"*. You can add multiple conditions to narrow down the selection. This is the most powerful option, because it automatically assigns teammates based on their data rather than manual selection.
At the bottom of the left panel, a checkbox lets you **auto-assign this signature to all future teammates** synced from your identity provider. This means new hires automatically get the right signature without any manual action.
Click **Confirm Selection** to save your changes.
Combining Smart Fields conditions with auto-assign is the most scalable approach. For example, you can create a signature for each department and use the condition *"If Department is Sales"*, so every current and future Sales team member will automatically get the right signature.
## Search and filter teammates
Above the table, use the **search bar** to find teammates by name.
Click the **filter icon** to narrow the list. Filters are organized into four categories:
* **Email**: With aliases / Without aliases
* **Information**: Filled / Missing (Smart Field completion)
* **Integrations**: Filter by connected provider (e.g., Microsoft 365)
* **Installation**: Installed / Not installed / Pending / Partially installed / Failed
Filters can be combined to quickly find, for example, all teammates with missing information whose installation has failed.
## Invite teammates
When you select one or more teammates using the checkboxes, an **Invite teammate** button appears at the top of the table. This is used for manual installation workflows: it sends an email inviting the selected teammates to install their signature themselves.
This is only relevant if you're not using an automated integration (Google Workspace, Microsoft 365 or Zoho Mail). With an automated setup, teammates don't need to take any action.
## Related articles
* [Signatures overview](/en/signatures-overview): how assignment fits into the wider signature workflow.
* [Smart Fields](/en/smart-fields): the data behind dynamic, condition-based assignment.
* [Preview signatures](/en/preview-signatures): check each assigned teammate's signature before installing.
* [Install signatures](/en/install-signatures): deploy the signature once teammates are assigned.
# Add a 'book a demo' CTA to sales team email signatures
Source: https://help.scribe-mail.com/en/can-i-add-a-book-a-demo-call-to-action-for-my-sales-team-email-signatures
Yes. Learn how to add a book-a-demo button to your Sales team's email signatures in Scribe, with Calendly, Chili Piper, and CRM integrations.
Yes. Scribe lets you add fully customizable buttons to your email signatures, including a "book a demo" call to action for your Sales team. You can style the button, change the label, and link it to any URL, like a Calendly page, Chili Piper widget, or a dedicated landing page.
## Why it works
Adding a booking link directly in your Sales team's email signatures lets prospects schedule a demo without having to reply to the email first. It removes friction from the buying process and turns every outreach email into a conversion opportunity.
According to our data, sales teams using a "book a demo" CTA in their Scribe signatures have seen **up to a 30% click-through rate**. At Scribe, we've observed that leads who receive cold emails and are interested often book a demo directly through the signature, without even replying.
## How to assign the right calendar link to each team member
Each salesperson typically has their own booking link. Instead of setting these up manually one by one, Scribe offers two ways to auto-fill the correct link for each person:
**Option 1: Custom Smart Fields**
Create a [custom Smart Field](/en/smart-fields) in Scribe to store each teammate's personal calendar link. Scribe will automatically insert the right link into each person's signature.
**Option 2: Calendar integrations**
Connect Scribe with [Calendly](/en/integrations/smart-fields/calendly-smart-fields) or [Chili Piper](/en/integrations/smart-fields/chili-piper-smart-fields) to sync booking links automatically. When a team member's calendar link changes, their signature updates too.
Both methods save you from having to ask each salesperson for their link or updating signatures manually.
## Install signatures in your Sales tools
Scribe integrates with the most popular sales platforms so your team's branded signatures (including the "book a demo" button) appear in every email they send:
* [Salesforce](/en/integrations/signatures/salesforce-client-side): automated installation
* [Outreach](/en/integrations/signatures/outreach-client-side): automated installation
* [SalesLoft](/en/integrations/signatures/salesloft-client-side): semi-automated installation
This means your Sales team gets consistent, on-brand signatures with a working booking CTA across their email client and their outreach tools, without any manual setup on their end.
You're not limited to "book a demo". You can create any CTA button in your signatures. Common examples include "Schedule a call", "Get a free quote", "Watch the product tour", or links to case studies and pricing pages.
# Can I add a GIF in my email signature?
Source: https://help.scribe-mail.com/en/can-i-add-a-gif-in-my-email-signature
Yes. Scribe supports animated GIFs in email signatures for logos and promotional banners. Learn why GIFs perform 3x better than static images.
Yes. Scribe supports animated GIFs in email signatures. You can upload a GIF with a maximum size of 5MB and use it as a logo, [promotional banner](/en/can-i-add-a-promotional-banner-in-my-email-signature), or any other visual element in your signature design.
GIFs are especially effective for promotional banners and animated logos because they capture attention in a way that static images can't. According to our data, **GIFs achieve a click-through rate 3x higher than static images** in email signatures.
## Why use a GIF in your email signature
**Visual engagement**
The dynamic nature of GIFs captures the recipient's attention immediately. In a crowded inbox, an animated element in your signature stands out from the standard text and static images.
**Higher click-through rates**
GIFs consistently outperform static banners. Our data shows a 3x higher CTR on animated signature elements compared to static ones, making them one of the most effective ways to drive traffic from your email signatures.
**Showcases brand personality**
A GIF can communicate your brand's tone in seconds, whether it's playful, professional, or innovative. Animated logos, product demos, or behind-the-scenes moments help make your brand memorable.
**Highlights promotions and offers**
A GIF banner can showcase special offers, new product launches, or upcoming events in a more visually compelling way than a static image. The motion naturally draws the eye to your call to action.
**Space-efficient**
GIFs convey a lot of information in a compact format. Instead of embedding a video or multiple static images, a single GIF can serve the same purpose more efficiently.
**Email client compatibility**
Most modern email clients support GIFs, including Gmail, Outlook (web and mobile), Apple Mail, and Yahoo Mail. On the few clients that don't support animation, the GIF will display as a static image showing the first frame, so your signature still looks clean.
**Keep it balanced.** While GIFs perform well, too many animated elements in a signature can be distracting. Stick to one GIF per signature, typically the promotional banner or the logo, not both. Also keep the file size reasonable (under 2MB is ideal) to avoid slow loading times on mobile devices.
Combine GIFs with Scribe's [campaign scheduling](/en/marketing-overview) to rotate animated banners across your team's signatures automatically, perfect for time-limited promotions or seasonal campaigns.
## Related articles
* [Add a promotional banner](/en/can-i-add-a-promotional-banner-in-my-email-signature): use a GIF or static image as a signature banner.
* [Marketing campaigns](/en/marketing-overview): schedule and rotate animated banners across the team.
* [Image blocks](/en/editor/image-blocks): add and size images in the signature editor.
# Can I add a promotional banner in my email signature?
Source: https://help.scribe-mail.com/en/can-i-add-a-promotional-banner-in-my-email-signature
Yes. Scribe lets you add promotional banners to email signatures with support for PNG, JPEG, and GIF. See use cases for inbound and outbound marketing.
Yes. With Scribe, you can add a promotional banner to any email signature. Upload your image, resize it to fit your design, and link it to any URL: a landing page, a blog post, an event registration, or a product page. Scribe supports PNG, JPEG, and [GIF](/en/can-i-add-a-gif-in-my-email-signature) formats up to 5MB.
Promotional banners turn every email your team sends into a marketing impression. With an average **12% click-through rate** on Scribe signature banners, this is one of the highest-performing and lowest-cost [marketing channels](/en/marketing-overview) available, because the emails are already being sent.
## Inbound use cases
Banners in email signatures are a powerful way to drive traffic back to your own content and resources from emails your team already sends every day:
* **Content promotion**: highlight a recent blog post, eBook, or whitepaper to drive traffic to your content resources
* **Event announcements**: share information about upcoming webinars, workshops, or conferences your company is hosting or attending
* **Product launches**: announce a new product or feature release to generate interest
* **Customer testimonials**: showcase a brief testimonial or case study to build trust and credibility
* **Promotions and discounts**: share limited-time offers on your products or services
* **Newsletter signup**: encourage recipients to subscribe to your company newsletter
* **Feedback and surveys**: invite recipients to participate in a survey or share feedback
* **Awards and recognitions**: showcase awards or certifications your company has recently received
## Outbound use cases
For Sales and business development teams, signature banners add a visual touchpoint to every outreach email, reinforcing your value proposition without adding to the email body:
* **Cold outreach**: promote a value proposition or free trial to encourage prospects to explore your offering
* **Follow-ups after events**: share more about your company in follow-up emails after meeting potential clients or partners
* **Sales proposals**: emphasize unique selling points or benefits when sending proposals
* **Product demos**: showcase a teaser of what prospects can expect in a demo
* **Job recruitment**: highlight perks of working at your company when reaching out to candidates
* **Partnership outreach**: feature successful case studies when emailing potential business partners
* **Press releases**: highlight key achievements when sending press releases to journalists
* **Affiliate programs**: promote your referral or affiliate program to partners or existing customers
## Best practices for signature banners
To get the most out of promotional banners in your email signatures, keep these principles in mind: make sure the banner aligns with the purpose of the emails it appears in, keep the design visually clean with a clear call to action, and update your banners regularly to keep them relevant and fresh.
With Scribe's [campaign scheduling](/en/marketing-campaign) feature, you can automate banner rotations across your team's signatures. Set start and end dates, and signatures automatically revert to their default state when a campaign ends.
## Related articles
* [Add a GIF](/en/can-i-add-a-gif-in-my-email-signature): use animated GIFs as signature banners.
* [Marketing campaigns overview](/en/marketing-overview): how campaign banners work across the team.
* [Create a campaign](/en/marketing-campaign): schedule banners with start and end dates.
* [Analytics](/en/analytics-overview): measure banner views, clicks, and CTR.
# Can teammates see their Scribe signature while composing?
Source: https://help.scribe-mail.com/en/can-my-teammates-see-their-scribe-email-signature-when-composing-an-email
Yes. Scribe uses client-side installation so your teammates see their signature in the compose window before sending, in both Gmail and Outlook.
Yes. With Scribe's client-side installation, your teammates see their full email signature in the compose window while drafting an email, in both Gmail and Outlook.
This means they get a visual confirmation that their branding, contact details, and any active campaign banner are in place before hitting send. There's no guessing, no surprises.
## Why this matters
Server-side signature tools append signatures *after* the email is sent. Your teammates never see it while composing, which can feel uncomfortable and makes it harder to catch issues.
Scribe defaults to client-side installation because it offers a better experience:
* **What you see is what they get**: the signature in the compose window is exactly what the recipient receives
* **Greater privacy**: emails stay within your email provider and don't route through external servers
* **No sending delays**: signatures are already embedded, so there's no server processing step
* **Instant updates**: when you update a signature in Scribe, it reflects immediately in your teammates' compose window
## What about mobile?
Client-side installation has limited support on some mobile email apps. If full mobile coverage is a priority, Scribe also offers server-side installation, or you can combine both methods for the best of both worlds.
Learn how each installation method affects mobile compatibility, email routing, and compose visibility.
# Climate
Source: https://help.scribe-mail.com/en/climate
Scribe dedicates 1% of revenue to carbon removal through Stripe Climate, funding emerging technologies that remove CO₂ from the atmosphere.
At Scribe, we are committed to fighting climate change. We dedicate [1% of our revenue](/en/pricing) to support the scaling of emerging carbon removal technologies through [Stripe Climate](https://climate.stripe.com/SdlecC), helping to remove CO₂ from the atmosphere.
Stripe Climate directs 100% of our contribution to carbon removal. Carbon removal projects are sourced and vetted by [Frontier](https://frontierclimate.com/), Stripe's team of science and commercial experts.
You can [learn more about our commitment](https://climate.stripe.com/SdlecC) on the dedicated page created by Stripe Climate as evidence of our actions.
## Related articles
* [Billing](/en/billing): see the Stripe Climate contribution on each invoice.
* [Plans](/en/plans): compare the Free, Business, and Enterprise tiers.
# Email Signature Management for Agencies
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-agencies
Manage branded email signatures for every client from one Scribe account. Separate workspaces, white label results, and instant rollouts in under a day.
Agencies live or die by the brands they shepherd, and email is one of the most active brand surfaces a client has. Yet signatures are usually the piece that slips: a client's team sends thousands of emails a month, each one carrying an outdated logo, a colleague's improvised formatting, or no branding at all. Chasing dozens of people across multiple client companies to fix their signatures by hand is the kind of low margin, high friction work agencies cannot afford.
With Scribe you run signatures as a managed service. Each client lives in its own [workspace](/en/workspaces), you design once in the visual editor, and you deploy branded signatures to a client's entire team in under a day. No per person setup, no IT tickets bounced between you and the client, and no risk of one client's data touching another's.
## Why offer signature management as an agency service
Signature management slots neatly beside the branding, web, and marketing work you already bill for, and clients rarely have anyone else handling it.
### A recurring line item, not a one off
Teams change every month: new hires, departures, title changes, a fresh campaign to push. Each of those is a reason for the client to keep you on retainer rather than a one time project that ends. You own the dashboard, so the work stays with you.
### It deepens the account
Once you manage a client's signatures, you are embedded in their daily brand operations. That is one more service the client would have to unwind to leave you, and one more place you demonstrate value every single day their team hits send.
### You can show the numbers
When you add a [campaign banner](/en/marketing-overview) to a client's signatures, you can report on exactly how many clicks it drove. On average, Scribe signature banners reach a 12% click-through rate. That is a concrete result you can put in a monthly report next to the rest of your deliverables.
## How the workspace model fits an agency
Scribe's [workspaces](/en/workspaces) were built for exactly your situation: one team managing many separate organizations.
### One account, isolated client workspaces
Every client gets a dedicated workspace with its own signatures, teammates, integrations, campaigns, and [analytics](/en/analytics-overview). The workspaces are walled off from each other, so there is no chance a client sees another client's data or branding.
### White label by default
The signatures you ship carry the client's identity, not Scribe's. The client experiences a clean, professional result and credits your agency for it.
### Switch clients in a couple of clicks
Move between client workspaces from the sidebar without logging in and out. Each loads instantly with its own settings, so updating a banner for one client and onboarding a team for another is a matter of minutes, not context switching across accounts.
### Roles for your team and theirs
Invite your account managers as Admins in a client's workspace so they can edit templates and launch campaigns, while ownership of the workspace stays with you. [Roles](/en/members) are set per workspace, so you can give client staff the Member role, which only lets them edit their own signature, and they never see your other clients.
## Setting up a new client
You can take a client from kickoff to fully deployed signatures inside a day.
From your dashboard, click your workspace name in the top left corner and select **+ New Workspace**. Name it after the client so it is easy to find later.
Use the [visual editor](/en/editor/editor-overview) to design a signature that matches the client's brand guidelines: logo, brand colors, fonts, social links, and any required elements. Build multiple templates if different departments or seniority levels need different layouts.
Link the workspace to the client's [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) account to enable teammate sync and deployment.
Scribe imports the team from the client's email provider, matches each person to the right template, and fills in personal details automatically through [smart fields](/en/smart-fields).
Install signatures across the whole team in one action. Each employee gets a personalized, branded signature with nothing required on their end.
Drop a promotional banner into the client's signatures: an event, a launch, a seasonal push, or whatever the client wants front and center.
## Services you can package with Scribe
* **Initial setup.** Design and deploy signatures for a client's whole team as a fixed price project.
* **Ongoing management.** Keep signatures current as the team changes, billed as a monthly retainer.
* **Campaign management.** Rotate banners through the [image library](/en/editor/image-library), launch them across the team, and report click performance. An easy add on most clients say yes to.
* **Rebrand rollouts.** When a client changes their identity, update the template once and every signature across their company refreshes immediately. A fast, visible win.
* **Onboarding bundles.** Pair signature setup with the other launch work you do: profiles, cards, site updates.
## Keeping a growing roster manageable
As you add clients, the operational overhead stays flat.
* **Repeatable workflow.** The setup is identical for every client, so the second client and the fiftieth take the same short path.
* **Independent integrations.** One client on Google Workspace and another on Microsoft 365 both work side by side, each connected only to its own workspace.
* **Per client analytics.** Track signature and campaign performance separately for each client and pull reporting that maps to what you invoice.
## The affiliate program
Beyond service fees, Scribe runs an [affiliate program](/en/affiliate-program). Refer clients to Scribe and you earn recurring commission on their subscriptions, giving you a second revenue stream alongside the work you bill. Find the **Become affiliate** option on the Scribe homepage to apply, and see the [Affiliate Program](/en/affiliate-program) guide for commission details.
## Why agencies pick Scribe
Most signature tools assume one company with one brand. Scribe assumes the opposite: many brands, clean separation, and one place to run them all. The workspace model keeps client data isolated, centralized billing means one invoice instead of a stack of subscriptions, and the visual editor means nobody on your team needs to write HTML to ship or update a signature. Scribe also offers agency pricing with volume discounts across workspaces, so reach out to sales for a quote tied to your roster.
## Get started today
Create your free account and start running signatures as a service for your clients. Scribe offers a 14 day free trial with no credit card required and access to all features. Visit [scribe-mail.com](https://scribe-mail.com) to begin, or click **Become affiliate** to earn on client referrals.
## Related use cases
* [Email signatures for design and branding companies](/en/company-type/email-signature-for-design-and-branding-companies)
* [Email signatures for marketing teams](/en/company-type/email-signature-for-marketing-teams)
* [Email signatures for small and medium businesses](/en/company-type/email-signature-for-smb)
# Email Signatures for Design & Branding Companies
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-design-and-branding-companies
Extend the brand identities you build all the way into every email. Pixel accurate signatures, instant rebrand rollouts, and one dashboard for every client.
You spend weeks perfecting a client's identity: the logotype, the palette, the type system, the grid, the voice. Then the client's team starts sending email, and the brand you built collides with reality. The site is immaculate, the social profiles are on brand, the cards are flawless, but every outgoing email carries last year's logo, the wrong blue, or no branding at all. For a studio whose whole value is consistency, that gap is the one deliverable nobody signed off on.
Scribe lets you carry the identity all the way to the inbox. Design a signature that matches the brand guidelines exactly in the [visual editor](/en/editor/editor-overview), and what you draw is what renders across web, desktop, and mobile mail clients. Deploy to a client's whole team in under a day, manage every client from one dashboard, and when the brand evolves, push the change everywhere at once.
## Why the signature belongs in the brand system
A signature is not an afterthought; it is the most repeated application of the identity you designed. A 40 person client can send tens of thousands of emails a month, each one a tiny brand impression. If those impressions are inconsistent, the rest of the system works against itself.
Treating signatures as a defined application, the same way you would specify letterhead or a social template, closes the loop. The identity you delivered now lives in the channel the client's team actually uses all day, and it stays correct because you control the template rather than trusting each employee to recreate it.
## A natural addition to your service portfolio
Signature work maps cleanly onto how studios already package and bill.
### Build it into identity and rebrand projects
Add signature design and deployment as a line item alongside the guidelines, logo files, and application examples. Clients expect the brand applied everywhere; email is simply one more spec you fulfill.
### Sell it as a standalone fix
Some clients arrive precisely because their signatures are a mess. Position it as a sharp, high impact engagement that delivers a visible result in under a day, with no developer on either side.
### Turn it into a retainer
Teams grow, campaigns rotate, identities get refined. Offer ongoing signature management as a monthly service and handle those updates so the client never has to.
### Upsell campaign banners
Scribe's [campaign banners](/en/marketing-overview) let you treat the signature as a small, recurring brand placement. Design seasonal banners, promote a client's event, or spotlight a new service, then report the results. On average, Scribe signature banners reach a 12% click-through rate.
## What Scribe gives a design studio specifically
### Pixel accurate control
The [visual editor](/en/editor/editor-overview) gives you real control over layout, color, type, spacing, and imagery. You design to the guideline, not to a template tool's idea of a signature, and the editor preview matches what lands in the inbox.
### Rendering that holds across clients
This is where most signatures fall apart. A layout that looks right in Gmail can break in Outlook or collapse on mobile. Scribe handles the cross client rendering so your composition survives the trip intact.
### Personalization without breaking the design
[Smart fields](/en/smart-fields) populate each person's name, title, department, phone, and photo into the template you built. One design, many people, zero drift from the standard.
### A reusable asset library
Keep client logos, banners, and brand imagery in the [image library](/en/editor/image-library) so the right assets are always at hand when you build or refresh a template.
## Setting up a client
You can go from brand guidelines to fully deployed signatures in under a day.
From your dashboard, click your workspace name in the top left corner and select **+ New Workspace**, named after the client.
In the [visual editor](/en/editor/editor-overview), apply the client's logo, colors, type, and layout. Build separate templates for any divisions or sub brands.
Link the workspace to the client's [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) account. See every option in the [Integrations overview](/en/integrations-overview).
Scribe imports the client's team, matches each person to a template, and fills their details through [smart fields](/en/smart-fields).
Install on brand signatures across the client's organization in one action, with nothing required from individual employees.
Extend the brand into a promotional placement and offer ongoing banner design as a monthly add on.
## Where Scribe shines: the rebrand rollout
Rebrands are the moment studios usually dread on the email front. The traditional path is to design the new signature, export HTML, hand it to the client's IT team, and then wait weeks while employees update one at a time, if they ever do.
With Scribe the rollout is instant. Update the template with the new assets and every signature across the client's organization refreshes at once: no HTML handoff, no IT ticket, no follow up nagging. That makes a clean promise you can put in a rebrand pitch: the new identity is live across every email, on every device, the day you launch.
## Earn with the affiliate program
Scribe's [affiliate program](/en/affiliate-program) pays recurring commission on the subscriptions of clients you refer, on top of your design and management fees. Sign up through the **Refer and earn** section in your Scribe sidebar.
## Managing many clients
* **Quick switching.** Move between client [workspaces](/en/workspaces) from the sidebar, each loading with its own data instantly.
* **Repeatable workflow.** The setup is the same every time, so a new client is a short, known process.
* **Independent integrations.** Each workspace connects to its own provider, so mixed Google Workspace and Microsoft 365 clients coexist cleanly.
* **Per client analytics.** Track performance separately for each client in [analytics](/en/analytics-overview) and use it to evidence your work.
## Why studios choose Scribe
The visual editor respects your design intent, so signatures look the way you drew them everywhere they land. Workspaces keep every client isolated under one login. Rebrands roll out in seconds instead of weeks. And signature work opens billable services, setup, retainer, and campaign design, plus [affiliate commissions](/en/affiliate-program) on the subscriptions themselves.
## Get started today
Create your free account and start carrying the identities you build all the way to the inbox. Scribe offers a 14 day free trial with no credit card required and access to all features. Visit [scribe-mail.com](https://scribe-mail.com) to begin.
## Related use cases
* [Email signatures for agencies](/en/company-type/email-signature-for-agencies)
* [Email signatures for fashion and beauty brands](/en/company-type/email-signature-for-fashion-and-beauty)
# Email Signatures for Schools and Universities
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-education
One signature system for faculty, staff, admissions, and students. Role based templates with office hours, booking links, and titles, deployed in under a day.
Educational non profits are eligible for a 30% lifetime discount. Contact the Scribe team to apply.
An educational institution is really many audiences sharing one domain. A professor emails students and research collaborators, an admissions counselor emails anxious applicants and their parents, the advancement office emails alumni and donors, and student workers email everyone. They all need a signature, but they do not need the same one, and that is exactly where manual approaches break down.
Scribe lets you run one signature system across the whole institution while giving each role its own layout and details. Faculty show office hours and a profile link, admissions shows a "Book a campus visit" button, advisors show a scheduling link, and students get a clean, branded line that identifies them without overstating their role. You design the templates once and Scribe deploys them in under a day, with no individual setup and no IT tickets.
## Why role based signatures matter in education
The defining challenge in education is not consistency for its own sake, it is that the right signature genuinely differs by role. A department chair's signature should not look like a teaching assistant's, and an admissions email should carry a call to action that a registrar's email should not.
Most institutions either give up and let everyone improvise, which produces a different font, layout, and level of detail in every inbox, or they send out instructions that busy faculty ignore. Both leave parents, applicants, and alumni with a fragmented impression of an institution that should look established and trustworthy.
Scribe resolves this with [smart fields](/en/smart-fields) and per group templates. Central branding stays locked, while each person's name, title, department, office, and hours populate automatically from your directory.
## A signature tailored to each role
Build a template per group in the [visual editor](/en/editor/editor-overview), then let smart fields personalize each one:
### Faculty and professors
Name, title, department, office location, office hours, and a link to their faculty profile or research page, so students and collaborators always know how and when to reach them.
### Admissions and enrollment
A "Schedule a campus visit" or "Apply now" button turns every reply to a prospective student into a next step. Pair it with a banner during application season to surface deadlines and information sessions.
### Academic advisors
Advising focus, office hours, and a booking link front and center, so students can schedule without a back and forth thread.
### Staff, administration, and student workers
Clean, branded signatures sized to the role: full contact details and institutional links for leadership and staff, and a simple identifying line for student workers and teaching assistants that avoids implying authority they do not have.
When someone changes departments or moves from teaching assistant to lecturer, you update their smart field values and the signature reflects it everywhere, no reformatting required.
## Promote institutional initiatives in every email
Beyond contact details, [campaign banners](/en/marketing-overview) let you turn your institution's email volume into a quiet broadcast channel you control centrally.
* **Admissions and enrollment**: application deadlines, open days, and virtual information sessions on admissions team signatures.
* **Advancement and alumni relations**: giving campaigns, reunions, and endowment drives in advancement and leadership signatures.
* **Events**: lectures, commencement, athletics, and academic conferences across the groups you choose.
* **Student support**: tutoring, counseling, library, and career services promoted through faculty and staff signatures where students will actually see them.
On average, Scribe signature banners reach a 12% click-through rate, which makes them a meaningful way to amplify announcements without competing for space in an already crowded student inbox.
## Run it across departments and campuses
**Workspaces for distinct units.** Use [workspaces](/en/workspaces) to give a graduate school, athletics department, or satellite campus its own templates and branding while keeping everything under one account. Assign editing rights to the people who manage each unit.
**Hands off deployment.** Connect Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment and signatures install across the institution automatically. Scribe syncs your directory so new faculty, staff, and student accounts are covered as they are added. See all options in the [Integrations overview](/en/integrations-overview).
**Renders everywhere.** Signatures display correctly across Gmail, Outlook, Apple Mail, and mobile apps, whether a professor writes from a desktop or a staff member replies from a phone.
**Instant institution wide changes.** Rebrand, update a logo, or post a required policy notice, and every signature updates at once. No mass email asking thousands of people to edit anything by hand.
## Setting up Scribe for your institution
Sign up at [scribe-mail.com](https://scribe-mail.com) for a 14 day free trial, no credit card required, with all features. Educational non profits can apply for a 30% discount.
Build layouts for faculty, staff, administration, admissions, advisors, and students, each with your institutional branding and the fields that role needs.
Map role specific details like department, office location, office hours, booking links, and titles so each signature fills in the right person's information.
Link Google Workspace or Microsoft 365 so Scribe can import faculty, staff, and students automatically.
Roll out institution wide or department by department. Every person gets their personalized signature with no action required from them.
Create banners for admissions, advancement, events, or student services and target them to the right groups.
## Security and student data
Institutions hold sensitive student and staff records. Scribe is SOC 2 Type II compliant and built to meet the standards educational organizations expect. Learn more about our [security](/en/what-scribe-does-concerning-security) practices and [data protection](/en/security/data-and-privacy) policies.
## Related use cases
* [Email signatures for non profits and charities](/en/company-type/email-signature-for-non-profits)
* [Email signatures for enterprise](/en/company-type/email-signature-for-enterprise)
## Get started today
Create your free account and have role based signatures deployed across your institution in under a day. Scribe offers a 14 day free trial with no credit card required, all features included.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Enterprise Email Signature Management at Scale
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-enterprise
Govern email signatures across thousands of employees, offices, and brands from one console. Roll out by department, enforce compliance, reach inboxes at scale.
A large organization sends tens of thousands of emails a day, and every one of them is a brand impression going out under your name. When signatures drift, with stale titles, old logos, missing disclaimers, and a different format from every person, that scale works against you: the inconsistency is everywhere at once. The fix has to operate at the same scale.
Scribe gives enterprise teams one place to govern signatures across the entire organization. Design templates centrally, assign them by department, region, or brand, and deploy to thousands of employees in under a day. No per-person setup, no queue of IT tickets, no expectation that employees will format their own signatures correctly.
## Why does signature management get harder as you grow?
Past a certain headcount, the manual approach stops working entirely. IT absorbs a steady stream of requests for new hires, role changes, transfers, and rebrands. Marketing cannot hold brand consistency when every employee builds their own signature by hand. Compliance has no way to confirm that the right disclaimer is on every outgoing message. Sending detailed instructions and a template to ten thousand people and hoping they paste it correctly is not a strategy, and the result is predictable: a patchwork of off-brand formatting and missing information.
Centralizing the signature in one platform removes the problem at its root. Instead of governing employee behavior, you govern a template, and the template is the source of truth.
## Governing signatures across the whole organization
**Templates assigned by org structure.** Build signatures in the [visual editor](/en/editor/editor-overview) and assign them to a department, a team, a region, or the whole company. Each person receives a personalized version with their own name, title, photo, and contact details filled in through [smart fields](/en/smart-fields). Sales can carry a booking link, legal a compliance disclaimer, a regional brand its own logo, all from the same console.
**Deployment that keeps pace with the directory.** Connect Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment and signatures roll out without employee action. New hires receive the correct signature the moment they appear in your directory, and a title change there flows straight through to the signature.
**Phased or all-at-once rollout.** Deploy to the entire company in one step, or stage it department by department to validate each group before the next. Either way the work happens centrally, not on individual machines.
**Server-side installation for full coverage.** When you need signatures applied on every device and client without relying on individual installs, route outgoing mail through Scribe's servers, where the signature is injected before delivery. It applies even on clients that client-side deployment cannot reach.
**One edit propagates everywhere.** A rebrand, a new legal disclaimer, an updated logo: change the template once and every signature across the company reflects it at once. No tickets, no employee action, no weeks of waiting for changes to spread.
**Consistent rendering on every platform.** Signatures render correctly across Gmail, Outlook (web, desktop, and mobile), Apple Mail, and the major clients, so a message from a laptop, phone, or tablet looks the same.
## Enterprise-grade security and compliance
Scribe is built to clear enterprise procurement and [security](/en/what-scribe-does-concerning-security) review. Scribe is SOC 2 Type II compliant, so organizational data is handled to a high standard of security and privacy.
* **[Data protection](/en/security/data-and-privacy).** Scribe processes only what it needs to generate and deploy signatures. With server-side installation it routes mail through secure servers to inject the signature but cannot read or edit the message body.
* **Compliance applied by default.** Legal disclaimers, confidentiality notices, and regulatory text live in the template and appear on every signature automatically, so no employee sends without the required disclosures.
* **Role-based access.** Owners and Admins manage templates, deployment, and campaigns, while the Member role is limited to a person's own signature. [Roles](/en/members) are set per [workspace](/en/workspaces), so a regional or brand team can run its own workspace without access to the others.
* **Directory sync.** Scribe pulls employee data from your directory and keeps signatures accurate as people join, move, and change roles, with no manual upkeep.
## Marketing reach at enterprise volume
With thousands of people each sending dozens of emails a day, your outbound mail is already one of your largest owned channels. The signature is the part of it nobody is using yet.
**[Campaign](/en/marketing-overview) banners in every signature.** Add banners to drive awareness for launches, events, webinars, thought leadership, and corporate initiatives. On average, Scribe signature banners reach a 12% click-through rate, applied across enterprise email volume that is a substantial amount of attention at no incremental cost.
**Audience targeting by department or region.** Run different banners for different groups: sales promotes a case study while HR promotes open roles, and each person sees only what is relevant to them.
**Scheduled campaigns.** Set start and end dates so banners appear and retire on their own, with no manual cleanup at the end of a push.
**[Analytics](/en/analytics-overview) and reporting.** Track impressions, clicks, and click-through rates per campaign to measure return, compare initiatives, and refine the program over time.
## Fitting into enterprise workflows
Scribe connects to the systems large organizations already run. See the full list in the [Integrations overview](/en/integrations-overview).
* **Google Workspace.** Automated deployment for Gmail across the organization.
* **Microsoft 365.** Full Outlook support across web, desktop, iOS, and Android, with both client-side and server-side options.
* **Salesforce.** Sync CRM contact data and use Scribe signatures in Salesforce email workflows.
* **HubSpot.** Connect marketing automation for coordinated campaigns.
* **Active Directory and Azure AD.** Sync employee data automatically so signatures stay accurate as the organization changes.
## Setting up Scribe across your organization
Despite the scale, rollout is straightforward.
Sign up at [scribe-mail.com](https://scribe-mail.com) or [book a demo](https://cal.com/forms/33a695aa-3046-40da-ba42-1d7cbb815da3) to walk through the platform with the Scribe team. You get a 14-day free trial with no credit card required and access to all features.
Build one or more templates in the visual editor, configuring layouts, brand colors, logos, social links, and the fields each department or brand should display.
Link Scribe to Google Workspace or Microsoft 365. Choose client-side deployment for a compose-time experience or server-side for full coverage.
Scribe imports employees from your provider or directory, matches each to the right template, and fills personal details through smart fields.
Roll signatures out across the whole organization in one step, or stage the deployment department by department.
Create banners, assign them to specific groups or the whole company, set scheduling, and track performance.
## Why enterprises choose Scribe
* **Speed.** Fully deployed in under a day regardless of headcount.
* **Simplicity.** No code and no long implementation project; marketing or operations can run it without heavy IT involvement.
* **Control.** Centralized management means you always know exactly what every signature contains, with no rogue or off-brand versions.
* **Scale.** The platform performs the same whether you have one hundred employees or ten thousand.
* **Support.** Enterprise customers get dedicated onboarding and support from the Scribe team.
## Related use cases
* [Email signature for SMB](/en/company-type/email-signature-for-smb): for smaller business units or subsidiaries that want the same branded rollout without a dedicated IT team.
* [Email signature for agencies](/en/company-type/email-signature-for-agencies): for organizations managing signatures across multiple brands or entities through separate workspaces.
* [Email signature management for IT teams](/en/company-type/email-signature-for-it-teams): for the IT owners who handle deployment and want to retire the recurring signature tickets.
## Get started today
Create your free account or book a demo to see how Scribe standardizes email signatures across your organization. Scribe offers a 14-day free trial with no credit card required and access to all features.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signatures for Fashion & Beauty Brands
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-fashion-and-beauty
Turn every email into a brand moment. Showcase collections, lookbooks, and launches in on brand signatures across sales, PR, wholesale, and customer care.
In fashion and beauty, the aesthetic is the product. Every touchpoint, from the campaign imagery to the unboxing, is calibrated to a single look. Email is one of the busiest touchpoints you have: your teams write to buyers, press, stylists, influencers, suppliers, and customers all week long. When those emails go out with mismatched fonts, a stale logo, or plain text, the premium impression you spend so much to build quietly erodes.
Scribe carries your aesthetic into every email and turns the signature into a merchandising surface. Showcase the new collection, the seasonal lookbook, or a launch directly in each signature, automatically, across every team. On average, Scribe signature banners reach a 12% click-through rate, so the correspondence your team already sends becomes a steady channel back to your store.
## Why consistency is non negotiable for a beauty or fashion brand
Imagine a buyer who receives a gorgeous lookbook from your sales lead, then a follow up from a colleague in default Outlook gray with no logo. Or a journalist whose polished pitch is undercut by the next note from your PR coordinator in a totally different format. Those small breaks read as carelessness, and carelessness is the one thing a premium brand cannot signal.
Scribe makes every email from every person carry the same logo, the same colors, the same considered layout, so the brand feels as deliberate in the inbox as it does on the shelf.
## Turn signatures into a merchandising channel
The real leverage for a fashion or beauty brand is the [campaign banner](/en/marketing-overview). It sits in every outgoing email and gives you a recurring, no cost placement in front of exactly the people you most want to reach.
* **Collection launches.** Feature the new season's hero imagery with a link to shop, so every email doubles as a launch announcement to buyers and press.
* **Lookbooks and catalogs.** Drive traffic to the digital lookbook without sending a separate blast.
* **Sales and promotions.** Surface a flash sale or seasonal offer to contacts who may never see your marketing list.
* **Events and pop ups.** Promote trunk shows, fashion week appearances, store openings, or masterclasses to people who already know the brand.
* **Product drops.** Spotlight a fragrance, a skincare launch, or a limited edition with a direct link to buy.
* **Collaborations.** Showcase a partnership with a banner pointing to the co branded campaign.
* **Sustainability stories.** Share certifications and sourcing commitments that matter to conscious shoppers.
Rotate banners on your campaign calendar, pre fall in June, holiday in November, resort in January, and swap them through the [image library](/en/editor/image-library) so every signature updates at once.
## What to put in a fashion and beauty signature
The [visual editor](/en/editor/editor-overview) lets you compose a signature that matches your brand as closely as your site does.
### Logo, colors, and type
Place the logo so it renders crisply on every device, and pull your brand colors into the text, dividers, and accents.
### The social channels that matter
Link to Instagram, TikTok, Pinterest, and YouTube, the platforms where visual brands actually live, so every email can recruit a new follower.
### Store and collection links
Point recipients to the online store, a specific collection page, or a clean "Shop now" landing page.
### A clear call to action
"Shop the collection," "View the lookbook," "Book an appointment," or "Request samples." Give every reader one obvious next step that matches the team sending it.
## How Scribe fits a fashion and beauty org
### One standard, every team tailored
Design templates in the [visual editor](/en/editor/editor-overview), then assign them by team. Wholesale gets showroom details and a "Request line sheet" button; customer care gets a "Track your order" link; PR gets a press kit link. Each person's details fill in through [smart fields](/en/smart-fields), so the brand stays uniform while the content fits the role.
### Automatic, hands off deployment
Connect your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment and signatures roll out to everyone with no manual setup. See all options in the [Integrations overview](/en/integrations-overview).
### Flawless on every device
Whether your sales director emails from the showroom floor or your PR manager replies from a show, the signature renders cleanly on desktop, web, and mobile.
### Instant updates for a fast calendar
When you launch a campaign or refine a product line's look, every signature across the company updates immediately, with no waiting on individual people.
## Use cases across the industry
* **Luxury houses.** Keep a signature experience as exclusive as the brand, and promote runway shows and new season arrivals.
* **Direct to consumer beauty.** Turn every customer care reply into a sales touchpoint with launch and promotion banners.
* **Wholesale and distribution.** Arm the sales team with showroom details, line sheet links, and buyer booking.
* **Cosmetics and skincare.** Promote launches, ingredient stories, and tutorials with links to product or booking pages.
* **Hair and salon brands.** Standardize signatures across locations and stylists, and push booking links and retail lines.
* **Jewelry and accessories.** Showcase new collections, custom order inquiries, and trunk show dates.
## Setting up Scribe for your brand
Sign up at [scribe-mail.com](https://scribe-mail.com) for a 14 day free trial, no credit card required, all features.
Build signatures in the [visual editor](/en/editor/editor-overview) with your logo, colors, social links, and a call to action. Create separate templates per team where useful.
Link your Google Workspace or Microsoft 365 environment and Scribe syncs your team automatically.
Install branded signatures across the whole team in one action, with no setup on anyone's part.
Upload imagery for your latest collection, promotion, or event, add a link, and assign it to your team's signatures.
## Why fashion and beauty brands choose Scribe
Your signatures match your visual identity as closely as your site and social do. Marketing is built into daily correspondence, so every email promotes the current moment with no extra effort. Banners swap as fast as your calendar demands. [Analytics](/en/analytics-overview) show which campaigns drive the most traffic to your store. And there is no IT team, code, or outside agency required: your brand or marketing team runs it all directly in Scribe.
## Get started today
Create your free account and start extending your aesthetic to every email your team sends. Scribe offers a 14 day free trial with no credit card required and access to all features. Visit [scribe-mail.com](https://scribe-mail.com) to begin.
## Related use cases
* [Email signatures for design and branding companies](/en/company-type/email-signature-for-design-and-branding-companies)
* [Email signatures for marketing teams](/en/company-type/email-signature-for-marketing-teams)
# Email Signature for Finance and Financial Services
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-finance
Put NMLS numbers, SEC and FINRA registrations, and disclaimers in every advisor email automatically. Deploy compliant signatures firm-wide in under a day.
In financial services, a signature is not decoration. It is a regulated part of every message an advisor, broker, loan officer, or relationship manager sends. NMLS numbers, registration details, and confidentiality language all have to be present, accurate, and current. When that responsibility is left to individuals copying HTML into Gmail or Outlook, the question is not whether a required element goes missing, but when.
Scribe moves signature compliance out of employees' hands and into a single template you control. You define the disclaimers, license fields, and legal notices once, and every person's signature carries them on every device and every email client. Auditors get consistency. Your team gets one less thing to remember.
## How do you keep required disclosures in every email?
Regulators including FINRA, the SEC, state banking departments, and insurance commissions expect specific disclosures in business communications, and email is where most of those communications happen. A manually managed signature is the weakest link: an advisor forgets to update a registration number, a new hire emails clients before anyone configures their signature, a loan officer's NMLS number never makes it onto the mobile app.
Scribe closes those gaps by centralizing the signature. The required text lives in the template, not in each person's memory, so the disclosure appears automatically the moment someone is added to your team.
### Per-person license and registration fields
Different roles carry different obligations, and each individual carries their own numbers. Scribe's [smart fields](/en/smart-fields) assign per-person values so the correct identifier appears in the correct signature without manual entry:
* **NMLS numbers** for mortgage lenders, loan officers, and brokers, displayed in every business message as required.
* **SEC and FINRA registration details** for advisors and registered representatives.
* **State insurance license numbers** for agents, including teams licensed across multiple states with different rules.
* **CPA license and firm registration numbers** for accounting and tax practices.
Update the template, and every advisor still sees their own number. Add a new licensee, and theirs populates from the directory.
### Disclaimers and legal notices, applied uniformly
Confidentiality notices, regulatory disclaimers, Equal Housing Lender language, FDIC or NCUA membership statements: add each once in the [visual editor](/en/editor/editor-overview) and it reaches every relevant signature. When language changes, you edit the template and the firm updates at once. There is no transition window where some employees are compliant and others are not.
## Enforcing compliance, even off-network
Client-side deployment pushes signatures through your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) connection, so they appear as people compose. For firms that need certainty rather than reliance, Scribe also offers server-side installation: outgoing mail is routed through Scribe's servers and the signature is injected before delivery. The disclaimer is applied even when an employee sends from an unsupported client or a personal device, which is exactly the scenario that fails an audit. See every supported platform in the [Integrations overview](/en/integrations-overview).
Either way, desktop clients, web mail, and mobile apps all carry the same compliant signature. A message sent from a phone in an airport looks the same, and discloses the same, as one sent from the office.
## Built for regulated data handling
Financial firms hold their vendors to a higher standard, and Scribe is built for that scrutiny. Scribe is SOC 2 Type II compliant and designed to meet the expectations of regulated industries. Review the details in our [security](/en/what-scribe-does-concerning-security) practices and [data protection](/en/security/data-and-privacy) policies.
With server-side installation, Scribe routes mail through its secure servers to inject the signature but cannot read or alter the body of your messages. Client communications stay private. [Role-based access](/en/members) keeps template, deployment, and campaign changes with the Owners and Admins that compliance and IT choose, so the people accountable for disclosures are the ones who control them. Anyone with the Member role can only edit their own signature.
## Where finance teams put Scribe to work
**Mortgage lenders and brokers.** Display each loan officer's individual NMLS number, carry state disclaimers and Equal Housing Lender notices, and revise compliance language firm-wide the day a rule changes.
**Wealth management and advisory firms.** Embed SEC or FINRA registration numbers and required disclaimers in every advisor's signature so client-facing communications stay consistent across the practice.
**Insurance agencies.** Surface each agent's license number and carrier affiliations, and manage state-specific disclosures for agents licensed across multiple jurisdictions using smart fields.
**Banks and credit unions.** Standardize signatures across branches and departments, with FDIC or NCUA membership notices, equal opportunity lender statements, and privacy disclosures baked in.
**Accounting and tax firms.** Keep CPA license numbers, firm registration details, and confidentiality notices in place year-round, then use [campaign banners](/en/marketing-overview) during tax season to flag filing deadlines and new services. On average, Scribe signature banners reach a 12% click-through rate, so even a compliance-led footer can quietly drive client action.
**Fintech companies.** Run a modern, branded signature that still meets the same regulatory bar as a traditional institution, and deploy it across a fast-growing headcount without slowing onboarding.
## Setting up Scribe for your firm
Sign up at [scribe-mail.com](https://scribe-mail.com). You get a 14-day free trial with no credit card required and access to all features.
In the visual editor, lay out your firm's signature with logo, brand colors, contact fields, and every required compliance element: disclaimers, NMLS and registration fields, and legal notices.
Configure smart fields for person-specific data such as NMLS numbers, state license numbers, and individual registrations so each signature shows the right values.
Link Scribe to Google Workspace or Microsoft 365. Choose client-side deployment for a seamless compose-time experience, or server-side for maximum enforcement.
Scribe imports people from your provider or directory, matches each to the correct template, and populates their personal and compliance details automatically.
Roll out compliant signatures to everyone at once, on every device, in a single step.
## Why financial firms choose Scribe
* **Compliance without the chasing.** Required disclaimers, numbers, and notices appear automatically, with no dependence on individuals to maintain them.
* **No coverage gaps.** Server-side deployment means every outgoing message carries the correct signature regardless of device or client.
* **Instant regulatory updates.** A rule changes, you edit one template, and the whole firm reflects it immediately.
* **Audit-ready visibility.** [Analytics](/en/analytics-overview) show deployment and campaign status, so you know which employees have compliant signatures installed.
* **Same process at any size.** Ten advisors or ten thousand, setup and ongoing management work the same way.
## Related use cases
* [Email signature for enterprise](/en/company-type/email-signature-for-enterprise): for large financial institutions standardizing signatures across thousands of employees, offices, and brands.
* [Email signature for SMB](/en/company-type/email-signature-for-smb): for boutique advisory practices and smaller firms that want compliant, branded signatures without a dedicated IT team.
## Get started today
Create your free account and have compliant email signatures live across your firm in under a day. Scribe offers a 14-day free trial with no credit card required and access to all features.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signature for Individuals and Solo Professionals
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-individuals
Build one polished email signature for your personal brand in minutes. No coding, no design skills, plus a banner that turns every email into reach.
Your email signature is the one piece of branding that goes out on every message you send, yet most solo professionals settle for a plain line of text. Scribe lets you design a single, polished signature that works as your digital business card, sets up in minutes, and needs no coding or design experience.
This page is for people who manage just their own signature: freelancers, consultants, solo founders, agents, coaches, and independent pros. If you are setting up signatures for a team, see the [startups](/en/company-type/email-signature-for-startups) or [SMB](/en/company-type/email-signature-for-smb) guide instead.
## Why does a single email signature matter so much?
When you work for yourself, you are the brand. Every email lands in someone's inbox with your name attached, and a thoughtful signature does three jobs at once: it tells people who you are, gives them a clear way to reach you, and quietly reinforces that you take your work seriously.
A plain text sign-off does none of that. A signature with your photo, role, and a link to your portfolio turns a routine reply into a small, repeated impression of your personal brand.
## What you can put in your signature
Scribe's [visual editor](/en/editor/editor-overview) gives you a live preview as you build, so you can see exactly how your signature looks before you use it. As a solo professional, these are the elements worth including:
### Photo or personal logo
A headshot or a simple mark puts a face to your name and makes you memorable.
### Title and what you do
Even working for yourself, a clear label like "Freelance Designer" or "Independent Consultant" tells people instantly how you can help.
### Focused contact details
Add only the channels you actually want used: phone, email, and a website link to your portfolio or booking page.
### Social links
Icons for LinkedIn, Instagram, or wherever you keep a professional presence.
### A campaign banner
Promote a new service, a recent article, or a limited offer with a [banner](/en/marketing-overview) below your signature. On average, Scribe signature banners reach a 12% click-through rate, which makes this one of the easiest marketing channels a solo professional can run. Swap the banner whenever your focus changes, without touching the rest of your signature.
## How to create your signature with Scribe
Going from nothing to a finished signature takes only a few minutes.
Create an account at [scribe-mail.com](https://scribe-mail.com). Your 14-day trial includes every feature and asks for no card up front.
In the [signature editor](/en/editor/editor-overview), pick a layout, drop in your photo, fill in your details, choose your colors, and add social icons. The live preview updates as you go.
Upload a banner image, point it at a link, and set it to appear on your outgoing mail. You can change it anytime.
Add your finished signature to your email client. Scribe walks you through Gmail, Outlook, Apple Mail, and more, step by step. See every supported platform in the [Integrations overview](/en/integrations-overview).
## Who this fits
**Freelancers and consultants.** Keep one consistent look across every client thread, and update it the moment you launch a new service.
**Real estate agents.** Show your headshot, brokerage logo, and license number, then rotate the banner to feature open houses or a fresh market report.
**Coaches and trainers.** Add a booking link so prospects can schedule with you directly, and use the banner to push your latest course.
**Content creators.** Point your banner at this week's video, episode, or post and refresh it as often as you publish.
## Scribe versus a free signature generator
Free generators can stamp out a basic signature, but they often add watermarks, lock customization behind a paywall, or hand you HTML that breaks in half the email clients you use.
Scribe is built specifically for signatures, so yours renders cleanly across Gmail, Outlook, Apple Mail, and mobile. Edit it once in your dashboard and the change applies on its own, with no copying and pasting fresh HTML every time. You also get [analytics](/en/analytics-overview) on the clicks your links and banners earn, so you can see what your contacts actually respond to.
## Related use cases
* [Email signatures for startups](/en/company-type/email-signature-for-startups): when your solo venture grows into a small team and you need everyone on the same branded signature.
* [Email signatures for SMBs](/en/company-type/email-signature-for-smb): for established businesses that manage signatures for departments from one place.
## Get started today
You can have a professional signature ready before your next email. Scribe's 14-day free trial unlocks every feature with no card required.
Visit [scribe-mail.com](https://scribe-mail.com) to begin.
# Email Signature Management for MSPs and IT Support
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-it-support-companies
Run email signatures for every client from one Scribe account. Separate workspaces, per-client integrations, and a billable managed service you set up in a day.
If you run an MSP or IT support business, you already own your clients' email infrastructure, which means you already own their signature problems: the new hires without a signature, the broken logo on someone's phone, the outdated phone number nobody flagged. Scribe lets you absorb all of that into a billable managed service and run it for every client from a single account, with each client kept in its own isolated workspace.
This page is about managing signatures on behalf of other organizations. You onboard a client in under a day, deploy branded signatures across their team, and then maintain them in minutes a month, turning a recurring annoyance into recurring revenue.
## Why add signature management to your service stack?
It fits naturally beside the email work you already do for clients, and it pays.
### A real client pain point you can finally close
Clients constantly raise inconsistent signatures, missing logos, and new hires without one. Today you write instructions nobody follows. With Scribe you fix it at the source and the requests stop coming back.
### A recurring, low-effort revenue line
Sell signature management as a monthly service. You do the setup once, ongoing maintenance takes minutes, and there is no custom scripting or manual HTML to babysit. Layer on campaign banners as an upsell, and note that on average, Scribe signature banners reach a 12% click-through rate, which gives your clients a visible reason to keep paying.
### Stickier client relationships
The more of a client's stack you manage, the harder you are to replace. Signature management is high-visibility and something clients rarely want to touch themselves.
## How do you keep clients separate?
Scribe [workspaces](/en/workspaces) are built for exactly this: one account, many client organizations, fully walled off from each other.
### One account, a workspace per client
Each client gets its own workspace with its own signatures, teammates, integrations, campaigns, and analytics. Clients never see one another's data, and you switch between them from the sidebar without logging in and out.
### Independent integrations per client
Every workspace connects to its own email provider. One client on Google Workspace and another on Microsoft 365 coexist in the same account with no interference. Connect each through the [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) integration, or any method in the [Integrations overview](/en/integrations-overview), including server-side injection and silent RMM deployment for managed Windows fleets.
### Centralized billing, one login
You pay from a single account, so there are no separate subscriptions to reconcile and you can mark up the service however you like.
## Onboard a new client in under a day
The flow is the same for every client, so once you have done it once you can repeat it fast.
From your dashboard, click your workspace name in the top left and choose **+ New Workspace**. Name it after the client.
Build a signature to the client's brand in the [visual editor](/en/editor/editor-overview): logo, brand colors, social links, and any departmental variants they need.
Link the workspace to the client's Google Workspace or Microsoft 365 account to enable teammate sync and deployment.
Scribe imports the client's people from their provider and populates each signature's personal details through [smart fields](/en/smart-fields).
Push signatures to the client's whole team at once, with nothing required from their employees.
Set up a promotional banner in the client's signatures. Offer banner management as a paid add-on.
## Services you can package and bill
* **Initial setup**: design and deploy branded signatures for a client's team for a one-time project fee.
* **Ongoing management**: add new hires, remove leavers, and keep branding current on a monthly retainer.
* **New hire onboarding**: fold signature provisioning into the onboarding you already run, so it deploys automatically when a person joins the directory.
* **Rebranding projects**: refresh an entire client's signatures in minutes when they change their look, a fast, visible win.
* **Campaign management**: build and rotate banners, then report on click-through and [campaign](/en/marketing-overview) performance as a premium add-on.
* **Compliance enforcement**: for clients in finance, healthcare, or legal, lock required disclaimers, license numbers, and notices into every signature using smart fields.
## Scaling across a growing client roster
As you add clients, Scribe stays manageable.
### Repeatable onboarding
The setup is identical for every client, so a new one takes well under an hour once your process is dialed in.
### Per-client analytics
Track signature coverage and campaign metrics for each client separately in [analytics](/en/analytics-overview), and pull reports that show the value you deliver.
### No client limit
Add as many client workspaces as your business needs. Scribe scales with you.
## Earn commissions through the affiliate program
Alongside your service fees, Scribe's [affiliate program](/en/affiliate-program) pays recurring commission. Refer a client and you earn 30% of their subscription for up to 12 months, and your referral gets a 30% discount at checkout. That gives you two income streams from the same work: what you charge for setup and management, plus commission on the Scribe subscription itself. There is no earnings cap.
Sign up from the **Refer and earn** section in your Scribe sidebar, or through the affiliate platform at scribe-2.getrewardful.com/signup.
## Related use cases
* [Email signatures for IT teams](/en/company-type/email-signature-for-it-teams): the internal counterpart, for IT departments deploying signatures inside their own single organization rather than across many clients.
* [Email signatures for agencies](/en/company-type/email-signature-for-agencies): a similar multi-account model for creative and marketing agencies managing signatures for the brands they serve.
## Get started today
Create your free account and start running email signatures for your clients. Scribe offers a 14-day free trial with no credit card required, full feature access.
Visit [scribe-mail.com](https://scribe-mail.com) to get started, or join the [affiliate program](/en/affiliate-program) to earn commission on client referrals.
# Email Signature Management Software for IT Teams
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-it-teams
Provision, sync, and lock down company email signatures from one admin console. Cut help-desk tickets, enforce disclaimers, and hand branding to Marketing.
For an internal IT team, email signatures are a small task that quietly drains hours. A new hire needs one before their first day. A promotion changes a title. Marketing wants a banner added by Friday. The logo breaks on someone's phone. Scribe turns all of that into a one-time setup: you connect your directory, define a template, and signatures provision themselves for every employee, on every device, from a single admin console you control.
Scribe is built for the person who has to keep an entire organization consistent and compliant. You decide the templates and the deployment method, you keep oversight through roles and audit-ready compliance rules, and you push the day-to-day creative work to the people who own the brand.
## Why do email signatures generate so many tickets?
Because every one of them is a small, manual edit that lands on IT's desk. The HTML has to render the same in Gmail, Outlook desktop, Outlook web, Apple Mail, and on iOS and Android, and a signature that looks right in one client often breaks in another. Multiply that fiddly formatting by every new hire, every title change, every rebrand, and every seasonal campaign, and you get a steady stream of low-value requests.
Scribe removes the whole category. You connect the source of truth once, and from then on signatures are generated, deployed, and kept current automatically.
### Provisioning that follows your directory
Connect Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment and Scribe imports your people. New employees are picked up automatically and matched to the right template. When a title, department, or phone number changes at the source, [smart fields](/en/smart-fields) update the signature to match. No ticket, no manual edit, no per-person HTML.
### Rendering you never have to debug
Scribe handles cross-client rendering so signatures display correctly in Gmail, Outlook (web, desktop, and mobile), Apple Mail, iOS, and Android. The broken-on-mobile ticket disappears.
## Which deployment method fits our environment?
Scribe gives IT several ways to roll out signatures, so you can match the method to how your org actually runs email.
### Client-side, automated through the provider API
Scribe deploys signatures through your email provider's API, so employees see their signature when composing. There is nothing to install on devices and no browser extensions to manage. This is the cleanest fit for most Google Workspace and Microsoft 365 organizations. See every option in the [Integrations overview](/en/integrations-overview).
### Server-side, applied after send
For the strongest guarantee of coverage, route outgoing mail through Scribe's secure servers, where the signature is injected before delivery. Every email carries the correct signature regardless of the device or client used to send it, including third-party apps. Scribe cannot read or alter the body of the message.
### Silent install via RMM
For managed Outlook on Windows fleets, push the Scribe desktop app through your RMM tool. Employees are logged in and signatures installed silently, with no action required from the user and no walk-through to write up.
### Manual HTML for edge cases
For niche clients outside automated deployment, employees can install their signature HTML themselves or accept an invitation to do so.
## How does IT keep control and stay compliant?
You set the guardrails, then let others work inside them.
### Roles and admin oversight
Scribe has three workspace [roles](/en/members). Owners and Admins manage templates, deployment, integrations, and campaigns, and only the Owner can delete the workspace or transfer ownership. Anyone with the Member role can only edit and install their own signature, so you decide exactly who gets management access.
### Enforced disclaimers and notices
Add confidentiality notices, legal disclaimers, or regulatory text once at the template level and they appear on every outgoing signature automatically. There is no path for an employee to send mail without the required disclosures.
### Security you can sign off on
Scribe is SOC 2 Type II compliant and processes only the data needed to generate and deploy signatures. Review the details on our [security](/en/what-scribe-does-concerning-security) and [data and privacy](/en/security/data-and-privacy) pages. For cloud deployment there is no client-side software to maintain, unless you deliberately choose the Windows RMM route.
## Hand branding to Marketing without losing oversight
Once your integration and templates are in place, give Marketing access to the [visual editor](/en/editor/editor-overview) and [campaign banners](/en/marketing-overview). They swap logos, run seasonal banners, and manage promotions on their own schedule, while IT stays focused on deployment and compliance. Those banner-swap and logo-update tickets stop reaching IT entirely, and the banners do real work: on average, Scribe signature banners reach a 12% click-through rate.
## Set it up once
The initial rollout takes less than a day. After that, signatures run on their own.
Link Scribe to your Google Workspace or Microsoft 365 environment. This one-time step grants the permissions Scribe needs to provision and manage signatures.
Design the signature in the [visual editor](/en/editor/editor-overview) and wire up [smart fields](/en/smart-fields) so name, title, department, and phone populate from your directory automatically.
Scribe imports employees and matches each to the right template. New hires are picked up by the sync going forward.
Roll signatures out to the whole organization at once. Every employee gets a personalized signature with nothing to do on their end.
Grant Marketing access to manage branding and banners. They own the visuals, you own the infrastructure.
## What stops landing on IT's desk
Once Scribe is live, these requests resolve automatically or move to Marketing:
* **New hire signatures**, provisioned the moment the person appears in the directory.
* **Title and department changes**, updated through directory sync and smart fields.
* **Logo and branding updates**, handled by Marketing in the visual editor.
* **Campaign banner changes**, run by Marketing in the campaign manager.
* **Disclaimer and compliance updates**, edited once in the template and deployed instantly to everyone.
* **Mobile rendering issues**, covered by Scribe's cross-client rendering.
* **Departure cleanup**, since a person removed from the directory is no longer managed.
## Track what is actually deployed
Scribe [analytics](/en/analytics-overview) shows you which employees have working signatures and how campaigns are performing, so you can confirm coverage across the organization at a glance.
## Related use cases
* [Email signatures for enterprise](/en/company-type/email-signature-for-enterprise): for larger organizations that need the same admin control at scale, with stricter security and governance requirements.
* [Email signatures for IT support companies](/en/company-type/email-signature-for-it-support-companies): if you manage signatures for outside clients rather than a single internal organization, this is the multi-client approach to use.
## Get started today
Create your free account and clear the email-signature backlog in under a day. Scribe offers a 14-day free trial with no credit card required, full feature access.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signature for Marketing Teams: Own the Channel
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-marketing-teams
Turn every employee email into a marketing channel your team controls. Deploy campaign banners, track clicks, and target by department, no IT ticket needed.
You already run the website, the paid campaigns, the social calendar, and the newsletter. Every one of those channels has a cost: ad spend, agency fees, or hours building lists and content. Meanwhile your company sends thousands of emails a week to people who already know you, and the signature space at the bottom of each one sits empty.
Scribe turns that space into a channel your marketing team owns outright. Design a banner in the morning, push it to every employee's signature, and watch the clicks land in your analytics dashboard by lunch. No developer time, no IT queue, no waiting on anyone else to ship your campaign.
## Why this channel belongs to marketing, not IT
For years email signatures lived with IT: someone exported HTML, mailed around install instructions, and updates crawled. Marketing had ideas for what the signature should say and no way to act on them. Scribe flips that. The platform is built for a marketer to run end to end.
### Design without touching code
The [visual editor](/en/editor/editor-overview) lets you build signatures and campaign banners the way you build a landing page: drag your logo in, set brand colors, drop in social links, and upload banner artwork. There is no HTML to hand off and nothing to QA across email clients by hand.
### Ship campaigns on your own schedule
[Campaign banners](/en/marketing-overview) are yours to create, schedule, and swap whenever a launch, event, or promo goes live. Set a start and end date and the banner appears and retires on its own, so a finished promotion never lingers in outgoing mail.
### Push updates company wide in seconds
When you change a banner, every employee's signature updates at once. A rebrand, a new tagline, or a fresh offer reaches every inbox your colleagues touch without a single person updating their settings.
## What marketing teams put in the signature
Your colleagues across sales, support, HR, and operations are already emailing the exact people you want to reach. A [campaign banner](/en/marketing-overview) rides along on every message.
* **Product and feature launches.** Announce what you shipped to contacts your nurture emails may never reach.
* **Events and webinars.** Put registration in front of people who already have a relationship with someone at the company.
* **Content distribution.** Drive traffic to a new report, guide, or video well beyond your subscriber list.
* **Seasonal promotions.** Rotate banners to match your promotional calendar, from launch season to year end offers.
* **Customer proof.** Surface a client quote or case study inside personal one to one emails, where it reads as a recommendation rather than an ad.
* **Employer brand.** Run a "We're hiring" banner so the emails your team already sends double as recruiting reach.
On average, Scribe signature banners reach a 12% click-through rate, and because the message arrives inside a personal email from someone the recipient knows, it behaves more like a referral than a placement.
## Run different campaigns for different teams
A single company-wide banner wastes the channel. Scribe lets you tailor what each group promotes so the message matches the audience on the other end of the email.
### Segment by department
Point your sales team's signatures at a case study while customer success promotes an upcoming webinar and recruiting runs the hiring banner. Each department carries the message most relevant to the people they email.
### Separate brands and regions with workspaces
If you manage more than one brand, market, or business unit, [workspaces](/en/workspaces) keep each one's templates and campaigns apart so a launch for one audience never bleeds into another.
### Keep personalization automatic
[Smart fields](/en/smart-fields) fill in each person's name, title, and contact details from your directory, so a single branded template stays correct for everyone without manual edits.
## Treat it like any other channel: measure it
Marketing runs on data, and a channel you cannot measure is a channel you cannot defend. Scribe [analytics](/en/analytics-overview) give you the numbers to optimize and report.
### See what is actually getting clicked
Track clicks per banner over time to learn which offers, formats, and calls to action earn attention, then retire the ones that do not.
### Compare campaigns head to head
Run one creative for a stretch, swap in another, and compare click-through rates to see which message wins. The signature becomes a low-stakes place to test positioning before you spend on it elsewhere.
### Report against your other channels
With no media spend behind it, signature performance is clean to attribute. Bring banner clicks into the same report as your paid and organic channels and show what the program returns.
## How marketing teams launch Scribe
Sign up at [scribe-mail.com](https://scribe-mail.com). You get a 14 day free trial with no credit card required and access to all features.
In the [visual editor](/en/editor/editor-overview), design a signature that matches your brand guidelines, then add [smart fields](/en/smart-fields) so each employee's details fill in automatically.
Link Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment to sync your people. See every supported platform in the [Integrations overview](/en/integrations-overview).
Roll out personalized signatures to everyone at once. No employee has to lift a finger.
Build a banner for your current initiative, assign it to the right teams, set the schedule, and it is live across the company in minutes.
Watch clicks in [analytics](/en/analytics-overview), test creative, and tune your campaigns over time.
## Campaign ideas to steal
* **Monthly content spotlight.** Feature last month's best-performing asset and refresh it on the first.
* **Event countdown.** As a big event nears, switch to an urgency banner and a register-now link.
* **Always-on launch.** Keep a banner on your newest product running across every department between formal campaigns.
* **Customer appreciation.** Rotate a real customer quote or milestone to build proof while recognizing the client.
* **Partner co-marketing.** Promote a joint launch or integration and reach both your contacts and your partner's.
## Why marketing teams choose Scribe
* **A channel you own.** No tickets, no developer dependency, no waiting to ship.
* **Instant reach.** A campaign goes from idea to every inbox in minutes.
* **Audience-matched messaging.** Different banners for different teams, brands, and regions.
* **Defensible results.** [Analytics](/en/analytics-overview) you can measure, compare, and report.
* **Scales with you.** Twenty employees or two thousand, every outgoing email carries your message on brand.
## Related use cases
* [Email signatures for sales teams](/en/company-type/email-signature-for-sales-teams): equip reps with demo links and offers when marketing hands the channel to revenue.
* [Email signatures for agencies](/en/company-type/email-signature-for-agencies): manage signature campaigns for multiple client brands from one place.
## Get started today
Create your free account and stand up a new marketing channel before the week is out. Scribe offers a 14 day free trial with no credit card required and access to all features.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signatures for Non Profits and Charities
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-non-profits
Give every staff email a donate button, a volunteer call, and your latest impact story. Branded signatures for non profits, deployed in under a day.
Non profits are eligible for a 30% lifetime discount. Contact the Scribe team to apply.
A non profit runs on relationships and on attention. Donors decide whether to give, volunteers decide whether to show up, and partners decide whether to vouch for you, often based on small signals of how serious and organized you are. The emails your team sends every day carry those signals, and most of them end with a name typed by hand or nothing at all.
Scribe turns that overlooked space at the bottom of every email into a branded, mission aligned asset. Your development team, program staff, board members, and volunteers all send the same polished signature, complete with a donate button and a rotating banner for whatever campaign is live this month. You design it once and Scribe pushes it to everyone, with no copy and paste and no asking already stretched staff to fiddle with formatting.
## Why does an email signature matter for a non profit?
Your inbox reaches the exact people every other channel is trying to buy access to: donors who have already given, volunteers who already care, foundation officers reviewing your grant. A signature banner in front of that audience is free reach you already own.
It also fixes a quiet credibility problem. When a major donor gets a reply from your executive director with a clean, branded signature, then a follow up from a program coordinator with a bare name, the inconsistency reads as disorganization. For an organization asking people to trust you with their money, every detail of presentation counts.
Left to individuals, signatures drift. Your grant writer has a careful one with a donation link, a caseworker has their name in a different font, and the new volunteer coordinator has nothing. Scribe gives the whole organization one consistent, professional voice while still personalizing each person's details.
## Turn donor and supporter emails into a fundraising channel
The biggest opportunity for non profits is Scribe's [campaign banners](/en/marketing-overview): a clickable strip in every signature that you control centrally and swap whenever your priorities shift.
### Drive donations year round
Add a standing "Donate now" banner so every reply to a supporter carries your giving page. When a campaign goes live, point the banner at it: your annual fund, a capital campaign, a giving day, or the end of year appeal that brings in a large share of yearly revenue.
### Recruit and mobilize volunteers
Swap in a "Volunteer with us" or "Sign up for the next shift" banner during recruitment pushes. The people emailing your organization are already warm, which makes them far more likely to step forward than a cold audience.
### Show impact and promote events
Feature a recent milestone, a beneficiary story, or your gala, benefit, or awareness walk. On average, Scribe signature banners reach a 12% click-through rate, so for an organization sending thousands of emails a month, that is a meaningful number of supporters clicking through with no ad spend.
Because banners are managed centrally, you align them to your calendar: spring gala in March, summer volunteer drive in June, year end appeal in November. Update once and every signature follows.
## What to put in a non profit signature
Scribe's [visual editor](/en/editor/editor-overview) gives you full control over the layout. Elements that work especially well for mission driven teams:
* **Your logo and a one line mission statement** so recipients are reminded what you stand for in every exchange.
* **A clear call to action button**: "Donate," "Volunteer," or "Attend the gala," giving every reader an obvious next step.
* **Contact details and social links** that make it easy to reach you and follow the stories you share elsewhere.
* **Required notices** such as a tax deductible giving line or a confidentiality note, applied consistently across the team.
[Smart fields](/en/smart-fields) fill in each person's name, title, and department automatically, so a single template covers everyone from the executive director to a weekend volunteer.
## Roll it out across staff, board, and volunteers
**Templates per group.** Build distinct layouts in the editor for development staff, program teams, leadership, and volunteers. Each group gets the right detail level while sharing your branding. Use [workspaces](/en/workspaces) if you run separate programs, chapters, or an affiliated foundation that need their own look.
**Hands off deployment.** Connect Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) account and signatures install across the organization with nothing required from staff. Scribe syncs your directory so new hires and volunteers are covered automatically. See every option in the [Integrations overview](/en/integrations-overview).
**Instant org wide updates.** Rebrand, refresh your tagline, or rotate the campaign banner, and every signature updates at once. No IT tickets, no all staff email asking people to change anything.
**Measure what works.** [Analytics](/en/analytics-overview) show how many clicks your donation links and campaign banners earn, so you can report engagement to your board and double down on the appeals that land.
## Examples by organization type
* **Community and social services**: keep signatures consistent across caseworkers and admin teams while promoting donation drives and volunteer needs.
* **Environmental and conservation groups**: surface advocacy campaigns and impact metrics, and recruit volunteers in every reply.
* **Arts and cultural organizations**: promote exhibitions, performances, and membership drives with links to your calendar or box office.
* **Faith based and advocacy groups**: maintain a warm, professional signature and drive supporters to events, petitions, or giving pages during key moments.
## Setting up Scribe for your non profit
Sign up at [scribe-mail.com](https://scribe-mail.com) for a 14 day free trial, no credit card required, with all features. Reach out to apply your 30% non profit discount.
In the visual editor, add your logo, colors, mission line, social links, and a donate button. Create separate layouts for staff, leadership, and volunteers if you need them.
Link your Google Workspace or Microsoft 365 account so Scribe can import your people automatically.
Push signatures across the organization at once. Each person gets their personalized version with no setup on their part.
Add a banner for your current appeal, event, or volunteer drive and start collecting clicks immediately.
## Security and donor data
Non profits hold sensitive donor and beneficiary information. Scribe is SOC 2 Type II compliant and built around strong [security](/en/what-scribe-does-concerning-security) and [data protection](/en/security/data-and-privacy) practices, so the details your supporters trust you with stay safe.
## Related use cases
* [Email signatures for education](/en/company-type/email-signature-for-education)
* [Email signatures for small and medium businesses](/en/company-type/email-signature-for-smb)
## Get started today
Create your free account and start turning everyday emails into a fundraising and volunteer channel. Scribe offers a 14 day free trial with no credit card required, all features included.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signature for Public Relations and PR Agencies
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-public-relations
Give journalists your contact details and press resources in every pitch. Showcase fresh coverage in seconds and manage client signatures from one PR platform.
PR runs on the inbox. You pitch reporters, chase editors, brief clients, and place stories one email at a time, and your name sits on every message. The signature at the bottom of that email is prime space: it is where a journalist on deadline finds your direct line, where a fresh placement gets one more set of eyes, and where the campaign you are pushing this week earns another click.
Scribe lets you turn that space into a working part of your media outreach. Stand up polished, on-brand signatures across your team in under a day, link journalists straight to your press resources, and swap in new coverage the moment it lands, all without anyone updating their own settings.
## Make life easier for the journalist on the other end
Reporters work on tight deadlines and route requests fast. A signature that answers their next question before they ask it gets you a callback. The [visual editor](/en/editor/editor-overview) lets you build a signature that does exactly that.
### Lead with how to reach you
Put your direct line, email, and best alternative contact right where a journalist looks. Add your beat or specialization, so "Senior Account Executive, Technology" or "VP, Consumer and Lifestyle" tells a reporter at a glance whether you are the right person.
### Hand over the press resources up front
Add a standing link to the online newsroom, media kit, or asset library so a journalist can self-serve the logo, headshot, or fact sheet they need without emailing you for it. A clear call to action button, "View press kit" or "See latest coverage", gives every recipient an obvious next step.
### Keep the whole team consistent
[Smart fields](/en/smart-fields) fill in each person's name, title, and contact details from your directory, so every account executive sends the same polished signature with their own details correct. To a journalist who hears from several people at your firm, that consistency reads as a credible, organized agency.
## Turn every pitch into a second touch
The real lift for PR is the [campaign banner](/en/marketing-overview) riding along under your message. Every pitch and follow up becomes a touchpoint for the story you are actively placing.
* **Client campaign of the moment.** Link to the press release, media kit, or campaign page so every email puts the current push in front of media and industry contacts.
* **Fresh coverage.** When a client lands a major placement, surface it in a banner to build momentum and prove traction to the next reporter.
* **Press events and launches.** Promote a media day, briefing, or product launch so the invitation travels with every message.
* **Awards and wins.** Showcase a shortlist, a client win, or agency recognition as quiet social proof.
* **Thought leadership.** Point to a bylined article, op-ed, or a leader's upcoming speaking slot.
* **New business.** On development emails, link to your capabilities deck, case studies, or client roster.
On average, Scribe signature banners reach a 12% click-through rate. Across the hundreds of pitches and follow ups a PR team sends each week, that is a meaningful lift in eyes on your press materials and coverage, with nothing extra to send.
## Move at the speed PR actually moves
News breaks, embargoes lift, and a story you placed this morning is old by this afternoon. Scribe keeps your signatures current at the same pace.
### Swap coverage in seconds
When a placement runs, change the banner once and it updates across every team member's signature immediately. No one chases colleagues to refresh a link, and the next email out the door already shows the win.
### Keep one message in a crisis
During a crisis, push a single banner across the whole team that points to the official statement, holding page, or designated press contact. Everyone speaks with one voice in every outgoing email, instantly.
### Run a banner per account team
Your tech team can promote a software launch while your consumer team promotes a retail campaign. Each group's signatures carry the work relevant to the contacts they are emailing.
## Manage client signatures as a service
If signature management is part of what you offer clients, [workspaces](/en/workspaces) let you run each client's brand, templates, and campaigns separately from a single account. Stand a new client up, assign their template, and bill it as a recurring deliverable alongside the rest of your retainer.
Connect each client to their [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment and signatures deploy to their team automatically. See every supported platform in the [Integrations overview](/en/integrations-overview).
## Prove the value to clients
PR fights to quantify its impact, and the signature channel hands you clean numbers. Scribe [analytics](/en/analytics-overview) show clicks per banner over time, so you can report exactly how many people clicked through to a client's coverage, press kit, or campaign page and fold it into the metrics you already share.
## Where PR teams put Scribe to work
* **Agencies.** Standardize signatures across account teams, run client-specific banners, and manage each client through a separate [workspace](/en/workspaces).
* **In-house communications.** Keep the corporate comms team consistent and promote company news and executive thought leadership.
* **Media relations.** Make press resources and contact details effortless to find, and match banners to the pitch calendar.
* **Event PR.** Promote previews, media days, and press conferences so every email carries the invite.
## Setting up Scribe for your PR team
Sign up at [scribe-mail.com](https://scribe-mail.com). You get a 14 day free trial with no credit card required and access to all features.
In the [visual editor](/en/editor/editor-overview), build a signature that reflects your agency's brand, with contact details, social links, and a standing press resources link.
Link Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment to sync your team.
Roll branded signatures out to the whole team at once, with each person's details filled in automatically.
Create a banner for your current client campaign, latest coverage, or press kit, assign it to the right account team, and start amplifying every email.
## Why PR professionals choose Scribe
* **Every pitch works twice.** A banner turns routine outreach into a second touch on your client's story.
* **Coverage goes live instantly.** Swap a banner the moment a placement runs.
* **Journalist-ready signatures.** Contact details and press resources where a reporter on deadline expects them.
* **Client-by-client control.** Separate [workspaces](/en/workspaces) and per-team banners keep every account distinct.
* **Reportable results.** [Analytics](/en/analytics-overview) you can put straight into a client update.
## Related use cases
* [Email signatures for marketing teams](/en/company-type/email-signature-for-marketing-teams): the campaign-banner playbook your marketing counterparts run across the whole company.
* [Email signatures for sales teams](/en/company-type/email-signature-for-sales-teams): turn the new-business inbox into a steady source of warm leads.
## Get started today
Create your free account and start amplifying your PR impact with every email. Scribe offers a 14 day free trial with no credit card required and access to all features.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signatures for Real Estate Agents and Brokerages
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-real-estate
Put your latest listings, open houses, and license number in every agent's email signature, then update them across the whole brokerage in seconds.
A buyer who emails you about a three-bedroom listing is also a buyer who might attend Saturday's open house, refer a friend, or remember your name when they sell their own home. Your email signature is the one piece of marketing that rides along on every reply, every offer thread, and every follow-up with a lender or title officer. Scribe turns that space into a working storefront: your headshot, your license number, and a banner promoting whatever listing or event you want in front of people this week.
For a brokerage, the harder problem is consistency. Agents come and go, each sets up their own signature, and license numbers go missing right when compliance matters most. Scribe gives the office one place to control every signature, while each agent's personal details still fill in automatically.
## Why your signature is prime real estate
Buyers and sellers choose agents they trust, and that trust starts forming before the first showing. A signature with a clear headshot, your office, and your direct line tells a prospect you are a real professional who is easy to reach. A signature that is a plain block of text, or worse an outdated one from two brokerages ago, quietly works against you.
The bigger opportunity is reach. Between buyer leads, seller prospects, co-listing agents, lenders, inspectors, and title companies, a working agent touches a wide network every week. A banner in your signature puts a listing or an open house in front of all of them without a single extra send.
## What belongs in a real estate signature
### License number, displayed correctly
Many states require agents and brokers to show their license number in business communications. With Scribe [smart fields](/en/smart-fields), each agent's license number is stored once and dropped into their signature automatically, so the right number appears on the right person's emails with no copy-paste mistakes.
### A headshot and brokerage branding
Real estate is a face-to-face business even before you meet in person. A consistent headshot, brokerage logo, and brand colors make every agent look like part of the same respected office rather than a collection of solo operators.
### The ways clients actually reach you
Direct cell, office line, email, and office address. Add links to your agent profile, the brokerage site, your Instagram or YouTube channel where you post tours and neighborhood updates, and a link to your current featured listing.
## How do I promote listings and open houses from my signature?
This is where Scribe earns its place for real estate. Using [campaign banners](/en/marketing-overview), the visual strip below your signature becomes a rotating marketing slot you control:
* **New listing.** Lead with a hero photo and a link straight to the property page the day it hits the market.
* **Open house.** Post the date, time, and a link to directions or an RSVP form, then swap to the next event each week.
* **Just sold.** Recent sales are social proof. A "Just sold" banner tells your whole network you are active and closing.
* **Virtual tours.** Point recipients to your Matterport, video walkthrough, or 3D tour so they can preview a home before they ever call.
* **Market updates.** Share your neighborhood report or monthly stats and position yourself as the local expert.
* **Buyer and seller guides.** Offer a free home valuation or buyer's guide as a call to action that captures leads passively.
On average, Scribe signature banners reach a 12% click-through rate. For an office sending hundreds of emails a week, that is a steady trickle of listing views and open house traffic with no ad spend.
## How Scribe works for a brokerage
### Build the template once, personalize it for everyone
Design the brokerage signature in the [visual editor](/en/editor/editor-overview): logo, brand colors, layout, and the disclaimers your compliance team requires. Smart fields then fill in each agent's name, headshot, title, direct line, and license number, so one template covers the whole office while every signature reads as personal.
### Deploy without touching each agent's computer
Connect Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment and signatures roll out across the brokerage automatically. New agents are signature-ready the day their email is provisioned. See every supported platform in the [Integrations overview](/en/integrations-overview).
### Separate signatures for different roles
Give buyer's agents, listing agents, team leads, brokers, and front-desk staff their own templates, each consistent with the brokerage brand but tuned to what that role sends.
### Update the whole office in seconds
A new listing goes live, a price drops, a home closes: change the banner once and every agent's signature updates at the same time. No memo asking forty agents to fix their own email.
## Real estate setups Scribe handles
* **Residential brokerages** standardize branding, headshots, and individual license numbers across every agent, then run coordinated banner campaigns for new developments or featured listings.
* **Commercial firms** can surface CCIM, SIOR, or other designations through smart fields and promote available space and lease opportunities.
* **Property management companies** keep property managers, leasing agents, and coordinators on one consistent signature, with links to tenant portals and available units.
* **Affiliated mortgage or title teams** can be managed alongside the brokerage using Scribe [workspaces](/en/workspaces), so each brand stays separate but lives under one account.
## Setting up Scribe for your office
Sign up at [scribe-mail.com](https://scribe-mail.com). The 14-day free trial needs no credit card and includes every feature.
In the visual editor, lay out the office signature with your logo, brand colors, a headshot slot, a license number field, contact details, and any required compliance text.
Connect each agent's headshot, license number, direct line, designations, and profile link so their signature populates on its own.
Link your email environment and Scribe syncs your roster and assigns the right template to each agent.
Push compliant, branded signatures across the office at once. Agents do nothing on their end.
Create a banner for your newest listing or this weekend's open house, assign it to the team, and start drawing eyes from every email.
## Why brokerages pick Scribe
* **Every email markets your listings.** Open houses, new listings, and "Just sold" wins ride on routine correspondence.
* **License compliance is automatic.** The correct license number appears on every agent's emails, with nothing for them to remember.
* **One brand across every agent.** The office looks unified no matter how technical each agent is.
* **Listings update instantly.** Swap banners office-wide the moment a property changes status.
* **You can see what works.** Scribe [analytics](/en/analytics-overview) show which listings and campaigns earn the most clicks, so you know where the interest is.
* **Agents stay focused on selling.** Scribe runs the signatures and banners in the background.
## Related use cases
* [Email signatures for sales teams](/en/company-type/email-signature-for-sales-teams): the same banner and tracking tools applied to outbound prospecting, useful if your brokerage runs an inside-sales or ISA desk.
* [Email signatures for marketing teams](/en/company-type/email-signature-for-marketing-teams): how a marketing lead can treat every employee inbox as a coordinated promotional channel.
## Get started
Open your free account and turn the bottom of every email into a listing showcase. Scribe's 14-day free trial includes all features, with no credit card required. Visit [scribe-mail.com](https://scribe-mail.com) to begin.
# Email Signatures for Sales Teams and Sales Reps
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-sales-teams
Give every rep a signature that books meetings: add a scheduling link, a case study, or an offer, then update it across the team and track the clicks.
A rep's signature sits at the bottom of every prospecting email, every follow-up, every proposal, and every "circling back" thread. That is hundreds of impressions a week per rep, all landing in front of people who are already in a conversation with your company. Most teams waste that space on a name and a phone number. Scribe puts a scheduling link, a case study, or a live offer there instead, so the recipient always has a next step one click away.
The catch with a busy sales team is that signatures drift. New hires copy an old one, reps tweak the formatting, the case study you wanted everyone to feature never makes it past three people. Scribe fixes that by managing every rep's signature centrally, so leadership decides what goes out and reps never have to think about it.
## Why signatures are a quiet pipeline source
Sales runs on touches, and your reps are already sending the touches. Each email carries a signature that could be working as a soft call to action: book time, read the proof, claim the offer. Because it shows up inside a one-to-one email from someone the prospect is already talking to, it reads as helpful rather than as an ad.
On average, Scribe signature banners reach a 12% click-through rate. Across a full team's outbound and follow-up volume, those clicks land on your demo page, your strongest case study, or your current promotion, with no cold outreach and no extra work from the reps themselves.
## What can a sales team promote in a signature?
Scribe [campaign banners](/en/marketing-overview) let sales leadership push the right asset to the right reps at the right moment:
* **Book a meeting.** A persistent "Book a Demo" or "Schedule a Call" banner linked to your Calendly, HubSpot, or Salesforce scheduling page gives every recipient a frictionless path to your calendar.
* **Proof.** Feature your strongest case study or a customer story so social proof rides along on every thread without the rep pasting it in.
* **Live offers.** Surface a limited-time discount, trial extension, or special pricing, and change it across the team the moment the promotion does.
* **Launches.** When a new product or feature ships, every prospect and customer hears about it through conversations already in motion.
* **Events and webinars.** Turn routine emails into invitations that reach engaged contacts.
* **Resources.** Point prospects to a comparison guide, ROI calculator, or demo video that does some of the selling for you.
* **Credibility markers.** Show G2 badges, analyst nods, or awards to build trust passively.
## Give every rep a signature that earns trust
A banner only works on top of a clean, professional signature. Scribe makes sure every rep has one.
* **Headshot.** A real face makes a prospect more likely to reply.
* **Role in plain terms.** "Account Executive, Mid-Market" or "Senior SDR" sets context instantly, and smart fields keep it accurate as people change roles.
* **Direct contact and calendar link.** Phone, email, and a booking link so the prospect reaches the rep their preferred way.
* **LinkedIn.** Essential in sales; a direct profile link lets prospects vet the rep.
* **Consistent branding.** Your logo, colors, and layout on every rep, with no mismatched formats.
## How Scribe works for a sales team
### Manage the template centrally
Design the team signature in the [visual editor](/en/editor/editor-overview), then use [smart fields](/en/smart-fields) to personalize each rep's headshot, name, title, phone, and calendar link. Every rep ends up with a polished, on-brand signature without lifting a finger.
### Deploy automatically and onboard new reps for free
Connect Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment and signatures roll out to the whole team. A new rep is signature-ready the day they start. Every supported platform is listed in the [Integrations overview](/en/integrations-overview).
### Carry signatures into your sales tools
Scribe deploys signatures and banners into the platforms your reps actually send from, with integrations for [Salesforce](/en/integrations/signatures/salesforce-client-side), [Outreach](/en/integrations/signatures/outreach-client-side), and [SalesLoft](/en/integrations/signatures/salesloft-client-side). The same branding and call to action travel with sequenced and one-off sends alike.
### Update campaigns in one move
When leadership wants to push a new case study, swap an offer, or spotlight a launch, change the banner once and it deploys across the team immediately. No chasing reps to update themselves.
### Target banners by segment
Run different banners for different groups using workspaces and assignment rules. Your enterprise team features a different case study than mid-market; SDRs run a "Book a Demo" button while AEs run a pricing offer. Each rep shows the banner that fits their outreach.
## How do I know it's working?
Sales teams live by the number, so Scribe [analytics](/en/analytics-overview) show the impact of your signature campaigns.
* **Click tracking.** See how many clicks each banner earns across the team and watch the trend over time.
* **Campaign comparison.** Test designs, messages, and offers, then compare them to find the winner.
* **Team view.** Spot which reps or segments generate the most clicks and share what they are doing.
* **Pipeline attribution.** Line up Scribe click data with your CRM to connect signature clicks to opportunities and closed deals.
## Setting up Scribe for your sales team
Sign up at [scribe-mail.com](https://scribe-mail.com). The 14-day free trial needs no credit card and includes every feature.
In the visual editor, build a signature that carries your brand and the essentials: headshot, phone, calendar link, and LinkedIn.
Link Google Workspace or Microsoft 365, then connect Salesforce, Outreach, or SalesLoft if your reps send from them.
Push branded signatures across the team at once. Reps do nothing on their end.
Spin up a "Book a Demo" button, your best case study, or a current offer and assign it to the team.
Watch clicks in analytics, swap banners, and test messages to keep improving what converts.
## Banner ideas for sales teams
* **Fresh customer win.** Rotate in a recent logo or quote and refresh it monthly to keep proof current.
* **Quarterly promotion.** Tie banners to each quarter's offer and deploy it to every rep automatically.
* **Competitive comparison.** Link to a page that helps prospects weigh you against alternatives.
* **ROI calculator.** Send prospects to an interactive tool that quantifies your value.
* **End-of-quarter push.** Add urgency with a quarter-end pricing banner in the closing weeks.
## Why sales teams pick Scribe
* **Every email carries a next step.** Demos, proof, and offers ride on routine sends, with banners that prospects actually click.
* **Campaigns deploy instantly.** Update offers across the team in seconds, with no rep action.
* **Reps look consistent and professional.** A polished, branded signature on everyone builds trust.
* **It follows reps into Salesforce, Outreach, and SalesLoft.** Branding and banners travel with their outbound.
* **The metrics are there.** Track clicks, compare campaigns, and tie signature marketing to pipeline with [analytics](/en/analytics-overview).
* **Reps just sell.** Scribe handles the signatures and banners in the background.
## Related use cases
* [Email signatures for marketing teams](/en/company-type/email-signature-for-marketing-teams): how marketing can own the banner program across every department's inbox, not just sales.
* [Email signatures for real estate](/en/company-type/email-signature-for-real-estate): a listing-driven take on the same scheduling links and "just closed" social proof, handy if you sell into brokerages.
## Get started
Open your free account and turn every sales email into a path to a meeting. Scribe's 14-day free trial includes all features, with no credit card required. Visit [scribe-mail.com](https://scribe-mail.com) to begin.
# Email Signature Management for Small and Mid Businesses
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-smb
Centralize branded email signatures across departments and locations, deploy in under a day, control them by role, and turn company email into reach.
An established small or mid-sized business runs on email, and at tens to a few hundred employees the signature stops being a personal touch and becomes part of how the whole company looks to customers. Scribe gives you one place to design, control, and deploy branded signatures across every department, with no individual setup and no need to chase anyone to update theirs.
This page is for businesses with structure: multiple teams or locations, someone who owns brand consistency, and a need to keep signatures right as people join, move, and change roles. Smaller, fast-growing teams will find the [startups](/en/company-type/email-signature-for-startups) guide a closer fit; very large, multi-brand organizations should see the [enterprise](/en/company-type/email-signature-for-enterprise) guide.
## Why signatures drift in a growing business
Once you pass a couple of dozen people, signatures rarely get worse on purpose, they just stop being anyone's job. Sales formats theirs one way, support another, a new hire never gets around to it, and a rebrand turns into a project no one wants to own. To a customer who hears from two of your people in a day, the mismatch reads as a company that is not quite buttoned up.
The fix is to stop managing people and start managing one source of truth. In Scribe the template is that source: you set it centrally, and every signature follows.
## How Scribe centralizes signatures for your business
**Templates assigned by team.** Design signatures in the [visual editor](/en/editor/editor-overview) and assign them across the company or to specific departments. Each person gets a personalized version with their own name, title, photo, and details filled in through [smart fields](/en/smart-fields), so sales can carry a booking link while support carries a help-center link, all from the same place.
**Automatic deployment.** Connect [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) and signatures install across the company without anyone touching their settings. New hires receive the right signature as soon as they are added to your provider.
**Server-side install when you need full coverage.** If you want signatures applied without relying on each person's device or client, route outgoing mail through Scribe's servers, where the signature is added before delivery. It reaches clients that client-side install cannot.
**Roles and workspaces for control.** Give the people who run templates and campaigns the Admin [role](/en/members), and anyone else you invite the Member role, which can only edit and install their own signature. Use [workspaces](/en/workspaces) to keep separate brands, regions, or business units organized under one account with central billing.
**One edit, everywhere.** Change a logo, add an office address, or update a disclaimer once, and every affected signature updates at the same time.
## Turn company email into a marketing channel
Your business already sends thousands of emails a week. A [campaign banner](/en/marketing-overview) below your team's signatures turns that volume into promotion for events, offers, product lines, or content. On average, Scribe signature banners reach a 12% click-through rate, and across an SMB's outgoing mail that adds up to real reach at no extra spend. Update the banner centrally and it changes across every signature on its own, with no action from staff.
## Setting up Scribe for your company
Even for larger teams, the rollout takes under a day.
Sign up at [scribe-mail.com](https://scribe-mail.com). The 14-day trial includes every feature with no card required.
Build your company signature in the visual editor: logo, brand colors, layout, and the fields to display. Create variations for departments that need them.
Link Google Workspace or Microsoft 365 to enable employee sync and automatic deployment.
Scribe imports your employees and matches each to a template, populating their details through smart fields.
Install signatures for the whole company at once. Every employee gets their personalized, branded version with nothing required on their end.
Create a banner, assign it to the right teams, upload the image, set the link, and go live.
## Who this fits
**Professional services firms.** Law, accounting, consulting, and financial advisory teams need consistent, polished signatures, with certifications, disclaimers, and office locations on every message.
**Retail and e-commerce.** Promote seasonal sales, new lines, or loyalty programs through banners so every customer email carries an offer.
**Healthcare practices.** Give every staff member a clean signature with the practice name, location, and a booking link, and use the banner for new services or patient portal access.
**Real estate brokerages.** Standardize the brokerage logo across agents while each agent's headshot, license number, and listings fill in through smart fields.
**Construction and trades.** Put your company name, license numbers, and a "request a quote" link on every email so the signature matches the quality of the work.
**Nonprofits.** Keep a professional look across the team and use banners for fundraising drives, events, and volunteer calls.
## What makes Scribe a fit for SMBs
Many signature tools assume you have a dedicated IT department. Scribe is built so a business owner or office manager can run it, while still offering the control a growing company needs.
**No IT department required.** A guided setup walks you through each step. If you can use Google Workspace or Microsoft 365, you can run Scribe.
**Scales with headcount.** Whether you have 20 employees or 300, adding a hire means they get the right signature automatically.
**[Analytics](/en/analytics-overview) built in.** Track clicks on links and banners to measure campaign impact and refine over time.
## Related use cases
* [Email signatures for startups](/en/company-type/email-signature-for-startups): for the smaller, fast-growing team that needs a simple rollout before departments and roles appear.
* [Enterprise email signature management](/en/company-type/email-signature-for-enterprise): when you reach thousands of employees, multiple brands, and formal governance and compliance needs.
## Get started today
Have your whole company on branded signatures in under a day. Scribe's 14-day free trial unlocks every feature with no card required.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signature Management for Startups
Source: https://help.scribe-mail.com/en/company-type/email-signature-for-startups
Roll out one branded signature across your whole startup in minutes, with every new hire set up automatically and a banner that promotes launches and roles.
A startup ships fast and hires faster, and a scrappy, inconsistent email signature undercuts all of it. Scribe lets a founder design one branded signature and push it to the whole team in a single afternoon, so every email to an investor, customer, or candidate looks like it comes from the same company.
This guide is for small, fast-growing teams, roughly a handful of people up to around twenty, where someone non-technical owns setup and the team is doubling rather than holding steady. Solo founders should start with the [individuals](/en/company-type/email-signature-for-individuals) guide; once you have departments and hundreds of seats, the [SMB](/en/company-type/email-signature-for-smb) guide fits better.
## Why do startups end up with mismatched signatures?
When everyone is heads-down building, signatures are an afterthought. One person pastes in a logo, another never sets one up, a third still has their last job's title. To anyone outside the company, that scatter reads as disorganization at exactly the moment you are trying to look credible to investors and early customers.
Leaving it to each person does not scale either. With Scribe you design the signature once and assign it to the team, so the founder controls the brand and nobody else has to think about it.
## What Scribe gives a growing team
**One template, personalized automatically.** Build your signature in the [visual editor](/en/editor/editor-overview), then assign it to the team. Each person's name, title, photo, and contact details fill in on their own through [smart fields](/en/smart-fields), so there is no per-person copy and paste.
**New hires set up before day one.** Connect Scribe to [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) and signatures install on their own. When you add someone to your email provider, their branded signature is waiting, no onboarding checklist item required.
**A rebrand is one edit.** Early startups change names, logos, and positioning constantly. Update the template once and every signature on the team reflects it at once.
**A free channel in every email.** Add a [campaign banner](/en/marketing-overview) below the team's signatures to push a launch, an event, or an open role. On average, Scribe signature banners reach a 12% click-through rate, which turns the mail your team already sends into reach you do not have to pay for.
**See what lands.** [Analytics](/en/analytics-overview) show the clicks your links and banners earn, so you can tell whether the "We're hiring" banner or the launch link is doing more work.
## How to set up Scribe for your startup
Setup is short enough to finish in one sitting, even as the team grows past a dozen.
Sign up at [scribe-mail.com](https://scribe-mail.com). The 14-day trial includes every feature and needs no card to start.
In the visual editor, add your logo, set your brand colors, choose a layout, and pick the fields to show: name, title, phone, social links, and more.
Link your Google Workspace or Microsoft 365 account so Scribe can sync the team and install signatures for you.
Scribe imports your people from your provider and matches each one to the template, pulling their personal details in through smart fields.
Install signatures across the whole team in one click. Everyone gets their personalized version without doing a thing.
## Moments where it pays off
**Fundraising.** Every email to an investor is a credibility check. A clean signature with your logo and title reinforces it, and a banner can point straight to your deck or site.
**Launches.** Line the team's banners up behind a new feature so each outgoing email doubles as a launch announcement to inboxes paid marketing cannot reach.
**Hiring.** A "We're hiring" banner puts open roles in front of hundreds of contacts a day with zero extra effort from anyone.
**Scaling the team.** As you go from five to twenty, manual signatures fall apart fast. Scribe keeps every new hire on-brand from their first email.
## Built to be simple
Scribe is designed for a non-technical founder to set up and forget. If your team uses Google Workspace or Microsoft 365, you already have everything you need, and the same setup that works for five people keeps working as you grow. When you reach the point of departments, multiple brands, or centralized roles, Scribe grows with you, and the [SMB](/en/company-type/email-signature-for-smb) guide covers what changes.
## Related use cases
* [Email signatures for SMBs](/en/company-type/email-signature-for-smb): the next step up, with departments, roles, and centralized control as your headcount climbs.
* [Email signatures for individuals](/en/company-type/email-signature-for-individuals): for the solo founder who only needs to manage their own signature today.
## Get started today
Have your whole startup on branded signatures before the week is out. Scribe's 14-day free trial unlocks every feature with no card required.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Configure your DNS
Source: https://help.scribe-mail.com/en/configure-your-dns
Set up a custom sending domain in Scribe to improve email deliverability and avoid spam filters. Takes 5 minutes, no developer needed.
Configuring your DNS is an important step to ensure your email signatures don't trigger spam filters. It takes about 5 minutes and doesn't require a developer. Scribe's setup wizard handles most of it automatically.
## Why configure DNS?
Your Scribe email signatures contain multiple URLs: logos, profile pictures, social icons, website links, campaign banners, and tracking links. By default, these URLs use Scribe's domain (`sendassets.io`).
The problem: spam filters flag emails that contain many URLs pointing to a domain different from the sender's email domain. If your team sends from `@yourcompany.com` but all signature links point to `sendassets.io`, deliverability can suffer.
The fix: replace Scribe's default domain with a subdomain of your own, like `signature.yourcompany.com`. This is called a **sending domain**. It tells spam filters that the links in your emails belong to your organization, keeping your emails out of spam folders.
For example, if your team sends from `joe@my-company.com`, you would configure a sending domain like `signature.my-company.com`.
## How to set it up
In your Scribe dashboard, navigate to **Settings → DNS**. If you've already synced your email provider, your domain will appear automatically. Click **Configure**. Otherwise, click **Add a domain**.
Type your company's primary domain. For example, `mycompany.com`.
Pick a subdomain prefix for your sending domain. For example, `signature` would create `signature.mycompany.com`. Other common choices include `email` or `mail-assets`.
Scribe's wizard will automatically configure the DNS settings with your domain provider. No developer or manual DNS editing required. Just follow the prompts.
## After setup
Once configured, DNS propagation can take up to 24 hours. You can check the status in two ways:
* In your Scribe dashboard under **Settings → DNS**, where the status will change to **Validated** once propagation is complete
* Using an external tool like [dnschecker.org](https://dnschecker.org/#CNAME/signature-assets.scribe-mail.com)
**If you use Cloudflare**, two settings must be adjusted:
* Set the Proxy Status to **DNS only** (not proxied)
* **Disable CNAME flattening**
Without these changes, the DNS validation will fail.
You can configure your DNS at any point, before or after installing signatures. But we recommend doing it early, ideally right after your initial setup, to ensure good deliverability from day one.
Full DNS configuration details and troubleshooting
# Create and manage signatures
Source: https://help.scribe-mail.com/en/create-and-manage-signatures
Learn how to create new signatures, duplicate existing ones, organize them into folders, and manage your signature library in Scribe.
## Create a signature
To create a new signature, click **+ Create New → Create Signature** from the top-right corner of the Signatures page.
The creation modal gives you two options:
* **Start from template**: Choose a pre-designed signature from the [template library](/en/editor/template-library) and customize it in the editor
* **Duplicate an existing signature**: Select any signature already in your workspace to use as a starting point
Give your signature a name (between 2 and 20 characters). A live preview appears on the right side of the modal so you can see what you're selecting before creating it.
Click **Create Signature** to open the signature, where you can customize the design, [assign teammates](/en/assign-teammates-to-a-signature), connect an integration, and [manage installation](/en/install-signatures).
Duplicating an existing signature is the fastest way to create variations, for example different signatures per department or country that share the same layout but with different branding.
## Create a folder
To create a folder, click **+ Create New → Create Folder** from the top-right corner.
Enter a folder name (between 2 and 20 characters) and click **Save**. Folders help you organize signatures by department, brand, country, or any other grouping that makes sense for your team.
## Organize signatures into folders
You can move a signature into a folder using the **⋯** menu on the signature card and selecting **Move to**. You can also drag and drop any signature card directly into a folder.
Click on a folder to view the signatures inside, and use the breadcrumb navigation at the top to go back to the main list.
## Edit a signature
Click the **⋯** menu on any signature card and select **Edit** to open the signature in the [editor](/en/editor/editor-overview). Any design changes you make are automatically pushed to all your teammates' installed signatures once you publish, with no need to reinstall.
## Duplicate a signature
Click the **⋯** menu on any signature card and select **Duplicate**. A copy of the signature is created in the same location (root or folder) with the name appended with "(Copy)".
## Delete a signature
Click the **⋯** menu on any signature card and select **Delete**. This removes the signature from your workspace permanently.
Deleting a signature that is currently installed will not automatically remove it from your teammates' email clients. You'll need to uninstall the signature first or install a different one in its place.
## Edit a folder
Click the **⋯** menu on any folder card and select **Edit** to rename it.
## Delete a folder
Click the **⋯** menu on any folder card and select **Delete**. You can delete a folder only after it is empty, so move or remove the signatures inside it first.
## Related articles
* [Filter and search signatures](/en/filter-and-search-signatures): find any signature by name, design status, or installation state.
* [Signatures overview](/en/signatures-overview): how the Signatures page and library fit together.
* [Signature variants](/en/signature-variants): add on-reply and internal versions of a signature.
* [Signature status](/en/signature-status): read the design, teammate, and installation indicators on each card.
# Email Signature Management for Executive Leadership Teams
Source: https://help.scribe-mail.com/en/departments/email-signature-management-for-executive-teams
Make every C-suite email a strategic touchpoint. Put investor resources, board materials, and ESG reports in leadership signatures with Scribe.
When a CEO emails an investor or a CFO emails a board member, that message lands in front of the audiences that judge the whole organization. The reader notices the details: a current title, a clean logo, formatting that holds together. They also notice when those things are wrong. A leadership signature is rarely neutral. It either reinforces that the company is buttoned up, or it quietly suggests the opposite.
Scribe gives executive communications both polish and purpose. It keeps every leader's signature consistent and current, and it turns the space below the message into a targeted distribution channel: a link to the latest earnings report when emailing an analyst, the board agenda when emailing a director, the ESG report when emailing a partner. These are not mass sends. They are high relevance touchpoints that happen naturally inside email a leader is already writing.
## Why does the signature matter at the executive level?
Executive email reaches the highest stakes audiences a company has: board members, investors, analysts, strategic partners, major clients, regulators, and press. Each message is read more closely than a typical internal email, and the signature is read along with it.
Two things make the signature uniquely valuable here. First, perception: consistent branding and a correct title across the leadership team signals discipline, while a stale signature undercuts the message above it. Second, reach: the people receiving these emails are exactly the ones you most want clicking through to your annual report, your board materials, or your dashboard. The signature puts the right resource in front of the right person, one conversation at a time.
On average, Scribe signature banners reach a 12% click-through rate. From a leadership inbox, those clicks come from the most influential readers in your network, which makes a relevant report or dashboard link in the signature far more valuable than its volume alone would suggest.
## Which leadership resources belong in the signature?
### Investor and earnings resources
Link to your investor relations page, latest earnings release, or annual review. Every email to an analyst or shareholder then carries a route to the numbers, reinforcing transparency without a separate send.
### Board materials
Point to your board portal or upcoming meeting agenda so directors reach preparation materials directly from the email that mentions them. Useful in exactly the window when a board member is most likely to be looking.
### ESG and sustainability reports
Keep your ESG report, diversity metrics, or corporate responsibility page one click away in every leadership email, so partners and stakeholders see the commitment surfaced rather than buried on the site.
### Strategic initiatives and announcements
Promote a major launch, partnership, or milestone through a [campaign banner](/en/marketing-overview), and refresh the message as the initiative moves through its phases.
### The leader behind the email
Each signature carries the executive's name, title, phone number, photo, and any custom fields you define. [Smart fields](/en/smart-fields) pull those from your directory, so a title is always current after a promotion and no leader is sending under last year's role.
## Tailor the message to each leader and audience
Leadership is not one voice. The CEO, CFO, and CTO write to different audiences and should not all be promoting the same thing.
### A different banner per executive
Assign banners by leader so each promotes what fits their audience: the CEO drives the annual report, the CFO the earnings deck, the CTO a technology partnership. [Roles and permissions](/en/workspaces) let an executive assistant or chief of staff manage this without giving everyone the keys to every template.
### Rotate with the corporate calendar
Run different banners through the year against earnings season, the annual report, an ESG update, investor day. Each period gets the content that matters then, and the switch is a single edit rather than a round of individual asks.
## Keep leadership signatures current without IT tickets
Executive priorities shift fast, and the people who manage leadership communications (assistants and chiefs of staff) need to move with them. Filing an IT ticket and waiting days to fix a banner or a title is not workable at this level.
Scribe removes that bottleneck. After IT does the one time connection, your executive support team runs everything else.
### Update messaging the moment priorities change
When a new partnership goes live or an earnings date moves, update the banner once and the change deploys across every leader's signature immediately. No ticket, no individual edits, no delay.
### Hold the line on consistency
Every leader stays on the same template and brand standard without anyone chasing individual executives. When a title changes or a new leader joins, signatures adjust through directory sync or [smart field](/en/smart-fields) edits.
## See what your most important readers engage with
Scribe's [analytics](/en/analytics-overview) show clicks and impressions across leadership signatures, so you can tell which reports and dashboards your board members, investors, and partners actually open. That is direct signal from a small, high value audience: useful for deciding which materials to keep front and center next quarter.
## Set it up in under a day
Link Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment. This one time connection lets Scribe deploy and manage signatures across the leadership team. See every supported platform in the [Integrations overview](/en/integrations-overview).
Build a leadership template in the [visual editor](/en/editor/editor-overview): logo, brand colors, and a call to action linking to investor resources, board materials, or your latest report. Add [smart fields](/en/smart-fields) so each executive's name, title, phone, and photo fill in on their own.
Create a [campaign banner](/en/marketing-overview) for your latest strategic initiative, investor update, or ESG report. Start from a template or design your own, then set the call to action and destination URL.
Scribe imports your executives from the directory, matches each leader to the template, and fills in their details automatically.
Roll signatures out to the whole leadership team at once. Every leader gets their personalized signature with the banner included, with nothing for them to set up.
## What executive teams gain with Scribe
* **A strategic touchpoint in every email.** Each leader's signature carries the report, dashboard, or initiative that matters to that audience right now.
* **Always current messaging.** When priorities shift, you update once and it lands in every signature immediately.
* **Premium, consistent branding.** No stale titles, broken formatting, or mismatched signatures across the C-suite.
* **Signal from the right audience.** Clicks and impressions show what board members, investors, and partners find worth opening.
* **Zero maintenance for leaders.** Signatures deploy and update centrally, so executives just send email.
* **Consistent everywhere.** Scribe renders correctly across Gmail, Outlook (web, desktop, mobile), Apple Mail, iOS, and Android.
## Related use cases
* [Email Signatures for Enterprise](/en/company-type/email-signature-for-enterprise)
* [Email Signatures for Sales Teams](/en/company-type/email-signature-for-sales-teams)
## Get started today
Create a free account and start turning leadership email into strategic touchpoints. Scribe offers a 14 day free trial with no credit card required, every feature included.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# HR Team Email Signatures: People Ops & HRIS Sync
Source: https://help.scribe-mail.com/en/departments/email-signature-management-for-hr-teams
Keep internal HR signatures accurate and on-message. Sync titles and departments from your HRIS, and link benefits, handbook, and onboarding from every email.
Your people team emails the whole company: new hires working through onboarding, employees with benefits and policy questions, managers coordinating reviews, and partners on the back end. Each message is a chance to point someone to the resource they need and to keep your internal communications looking consistent. Most HR emails waste that chance on a plain signature.
Scribe puts the right links in every HR signature and keeps the contact details accurate on their own. Titles and departments sync from your HRIS, benefits and handbook links sit one click away, and you can refresh what is featured as enrollment windows and programs come and go.
## Why signatures matter for people ops
HR sets the tone for how the company runs internally. You guide new hires through their first weeks, field benefits and policy questions, and run programs that touch every employee. When the signature on those emails is polished and points to the right resource, employees get answers without a second message, and your team looks organized doing it.
Think about how often a reply comes back asking where the benefits portal lives, or a new hire wants the handbook link, or someone needs the form for a life event. Each of those is a follow-up your team has to write. A signature with a clear "Access Benefits Portal" or "View Handbook" button gives people that path up front. On average, Scribe signature banners reach a 12% click-through rate, so a real share of employees self-serve instead of adding to your queue.
## What you can put in an HR signature
### HRIS-synced titles and departments
This is the piece that keeps internal signatures honest. [Smart fields](/en/smart-fields) pull each person's title, department, and contact details straight from your HRIS, BambooHR, Workday, Rippling, Gusto, Hibob, and more are supported, so when someone is promoted or moves teams, their signature reflects it on the next sync. No stale titles, no manual edits.
### Benefits and enrollment links
Add a button to your benefits enrollment page, plan details, or claims portal. Employees reach coverage information without asking, and you stop fielding the same question every open-enrollment season.
### Employee handbook and policy access
Link directly to your handbook, policies, and workplace guidelines. Every email your team sends quietly points people to the documentation they should be reading.
### Onboarding resources
Share orientation materials, training portals, and first-day instructions so new hires can find what they need from their very first HR email.
### Wellness and development programs
Keep mental-health resources, learning platforms, and professional-development programs visible in everyday communication, not buried in an intranet no one visits.
## How do I keep internal comms consistent and current?
The real win for HR is turning routine email into a self-service resource center while keeping every signature uniform.
### Cut repetitive questions
A persistent benefits or handbook button gives employees a clear path to find information themselves, which means fewer "where do I find..." replies landing in your inbox.
### Feature the program of the moment
Use [campaign banners](/en/marketing-overview) for open-enrollment deadlines, a new wellness initiative, or an all-hands announcement. Swap the banner as the calendar moves through the year.
### Update a policy link once
When a policy changes or a resource moves, update the link in the banner a single time and it deploys across every team member's signature. No broken links left behind in old templates.
### See which resources land
The [analytics dashboard](/en/analytics-overview) shows how many people click through to each portal or resource, so you can spot which communications work and where employees are still in the dark.
## Set it up in under a day
Getting your HR team's signatures live takes less than a day. After setup, it runs on its own.
Link Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment. This one-time step lets Scribe deploy and manage signatures across the team. Both client-side and server-side install are supported (see the [Integrations overview](/en/integrations-overview)).
Link your HRIS so [smart fields](/en/smart-fields) can pull titles, departments, and contact details automatically. With the source connected, signatures stay accurate as people move through promotions and transfers.
Use the [visual editor](/en/editor/editor-overview) to build an on-brand template with your logo and colors, then add a call to action linking to your benefits portal or handbook. Map [smart fields](/en/smart-fields) to each person's name, title, department, and phone.
Create a [campaign banner](/en/marketing-overview) for your benefits portal, handbook, or a current initiative. Start from a template or design your own, then set the call to action and destination URL.
Scribe imports your HR team from the provider directory, matches each person to the right template, fills in their details, and installs signatures across the team in one move. New team members get picked up by future syncs.
## No IT tickets to update a link
HR priorities shift constantly: enrollment opens, a policy changes, a wellness program launches. Waiting on IT to update a link every time is not workable.
After the one-time connection (which IT handles once), your HR lead manages everything from Scribe.
### Change banners on your own
Swap a benefits link, update a handbook URL, or rotate an announcement directly in Scribe. Changes deploy across the team instantly.
### New team members picked up automatically
When someone joins HR in your provider directory, the next sync deploys their signature with no extra work.
### Details stay current
When someone changes roles or departments, their signature updates through HRIS sync or a quick [smart field](/en/smart-fields) edit, so the title in the signature always matches the title on record.
## Banner ideas for HR teams
Not sure what to feature? A few starting points:
* **Benefits portal.** A persistent "Access Benefits Portal" button for enrollment, claims, and coverage.
* **Employee handbook.** A link to policies and guidelines so answers are always one click away.
* **Open-enrollment deadlines.** A dated banner reminding employees when they need to act.
* **Wellness programs.** Mental-health resources, fitness perks, or your employee assistance program.
* **Learning and development.** Training platforms, certifications, and growth resources.
* **Company events and culture.** All-hands, team-building, and cultural initiatives to build participation.
* **Employee surveys.** A link to engagement surveys or pulse checks to gather feedback.
* **New-hire resources.** Onboarding checklists and first-day information for your newest employees.
## What HR teams gain with Scribe
* **Always-accurate signatures.** HRIS sync keeps titles and departments correct as people move, with no manual upkeep.
* **Fewer repetitive questions.** Direct links to benefits, handbooks, and resources let employees self-serve.
* **Instant policy updates.** Change a link once and it appears for every team member immediately, with no tickets.
* **Visibility into engagement.** Track clicks by campaign, team, or individual to see which resources employees actually use.
* **Consistent internal comms.** Every team member sends a polished, uniform signature, with no mismatched formatting.
* **Renders everywhere.** Gmail, Outlook (web, desktop, mobile), Apple Mail, iOS, and Android all show the signature correctly.
## Related use cases
* [Email signatures for recruiting teams](/en/departments/email-signature-management-for-recruiting-teams)
* [Email signatures for operations teams](/en/departments/email-signature-management-for-operation-teams)
## Get started today
Create your account and turn every HR email into a resource employees can act on. Scribe offers a 14-day free trial with no credit card required, full feature access.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signature Management for Operations Teams
Source: https://help.scribe-mail.com/en/departments/email-signature-management-for-operation-teams
Stop chasing vendors for missing paperwork. Put portal links, insurance requirements, and payment forms in every operations email signature with Scribe.
Operations runs on documents that arrive late. A vendor needs the right form, a contractor cannot find the payment portal, a new supplier asks where the onboarding packet lives. Each of those is a follow up email and a few days of waiting, and your team writes the same "here is the link" reply over and over. The link almost always exists. It is just buried in a thread or a separate attachment instead of being where the vendor is already looking.
Scribe moves those links to the one place that shows up in every message you send: the signature. Put your vendor portal, insurance requirements, and payment forms at the foot of every email, manage them centrally, and update them the instant a process changes. The information travels with the conversation, so the chase mostly stops happening in the first place.
## Why does the signature matter for operations?
Operations is the connective tissue between vendors, contractors, suppliers, internal stakeholders, and compliance. That means a lot of outbound email to people outside the company who need to do something: submit a certificate, register on a portal, file an invoice. The friction is rarely that they refuse. It is that they do not have the link in front of them when they go looking.
A signature that always carries the right portal link removes that friction by default. Instead of a vendor replying "where do I send this?", the answer is already sitting under your message. Multiply that across every email an operations coordinator sends in a week and you have removed a steady drip of follow ups.
On average, Scribe signature banners reach a 12% click-through rate. For an operations workflow, that share of vendors and partners clicking straight through to the portal or form you need is paperwork that arrives on its own, without anyone on your team prompting it.
## Which operations resources belong in the signature?
### Vendor and supplier portals
Add a clear "Access Vendor Portal" button so external partners can reach your onboarding, registration, or self service tools without writing to ask. It is on every email, so they never have to hunt for the last message that contained the link.
### Insurance and compliance requirements
Link straight to your insurance certificate requirements or compliance documentation. Every email then quietly tells vendors exactly what they need to submit, which heads off the round of back and forth that usually precedes a missing certificate.
### Payment and invoicing
Point to your invoice submission page or accounts payable instructions so vendors can file correctly the first time. Fewer misrouted invoices means fewer payment delays landing back on your desk.
### The coordinator behind the email
Each signature carries the team member's name, title, department, and phone number. [Smart fields](/en/smart-fields) pull those from your directory, so a vendor always knows exactly who they are dealing with and the details stay correct without manual edits.
## Keep links current when the process changes
Operations processes are never finished. Requirements get revised, portals migrate, a new form replaces an old one, a compliance deadline moves. The danger is signatures quietly sending vendors to a retired URL or last year's form.
Scribe centralizes that control. Update the banner or its destination once and the change deploys across every team member's signature at the same moment. There is no per person setup and nothing for individual coordinators to maintain.
### Operations can own it, not just IT
After IT handles the one time connection, your operations leadership runs the rest. When a form is replaced you swap the link that day, and when a compliance window opens you push the announcement to every signature at once. No ticket to another team, no waiting.
### New team members are picked up automatically
When someone joins operations in your email provider directory, Scribe matches them to the template on the next sync and deploys their signature. Role and department changes flow through directory sync or [smart field](/en/smart-fields) edits the same way.
## See which resources vendors actually use
Scribe's [analytics](/en/analytics-overview) show clicks and impressions by campaign, by team, and by individual team member, so you can see which portals and forms vendors engage with and where a communication gap is leaving paperwork stuck. If a banner pointing at your onboarding packet barely gets clicks, that is a signal the link, the wording, or the process itself needs another look.
## Set it up in under a day
Link Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment. This one time connection lets Scribe deploy and manage signatures across the operations team. See every supported platform in the [Integrations overview](/en/integrations-overview).
Build a clean, professional template in the [visual editor](/en/editor/editor-overview): logo, brand colors, and a call to action linking to your vendor portal or compliance docs. Add [smart fields](/en/smart-fields) so each member's name, title, department, and phone number fill in on their own.
Create a [campaign banner](/en/marketing-overview) for your vendor portal, insurance requirements, or payment forms. Start from a template or design your own, then set the call to action and destination URL.
Scribe imports your operations team from the directory, matches each person to the template, and fills in their details automatically. Later joiners are caught by future syncs.
Roll signatures out to the whole team at once. Every member gets their personalized signature with the banner included, and no one has to set anything up.
If operations spans several functions (procurement, facilities, logistics), keep them in separate [workspaces](/en/workspaces) so each can run its own portals and banners independently.
## Campaign ideas for operations teams
* **Vendor portal access** as a persistent "Access Vendor Portal" button that gives suppliers a route to your self service tools on every email.
* **Insurance certificate requirements** linked directly, so vendors always know which certificates to provide.
* **Payment and invoicing portal** as a "Submit Invoice" link that keeps accounts payable self service.
* **Compliance deadlines** featured in a banner so vendors see what is due and when.
* **New vendor onboarding** linking to your packet, qualification forms, or contractor agreements.
* **Process and policy updates** announced through a banner so every partner sees the change in your daily email.
* **Safety and regulatory information** for teams working with contractors and field service providers.
## What operations teams gain with Scribe
* **Fewer follow up emails.** Every signature carries the portals and forms vendors need, so paperwork arrives without the chase.
* **Instant process updates.** When a form moves, you update the link once and it lands in every signature immediately.
* **Visibility into engagement.** Clicks and impressions per campaign show which resources vendors use and where gaps remain.
* **Consistent, professional branding.** No more mismatched formatting, stale logos, or missing contact details.
* **Zero member maintenance.** Signatures deploy and update centrally, so the team just sends email.
* **Consistent everywhere.** Scribe renders correctly across Gmail, Outlook (web, desktop, mobile), Apple Mail, iOS, and Android.
## Related use cases
* [Email Signature Management for Customer Support Teams](/en/departments/email-signature-management-for-support-teams)
* [Email Signature Management for HR Teams](/en/departments/email-signature-management-for-hr-teams)
## Get started today
Create a free account and stop chasing vendors for missing paperwork. Scribe offers a 14 day free trial with no credit card required, every feature included.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Recruiting Team Email Signatures: Employer Brand
Source: https://help.scribe-mail.com/en/departments/email-signature-management-for-recruiting-teams
Turn every recruiter email into a candidate touchpoint. Add we're hiring banners, careers page links, and interview scheduling links to every signature.
Your recruiters reach out to candidates, hiring managers, agencies, and campus contacts all day long. Each of those emails is a chance to sell your employer brand, yet most end with a flat block of contact details. Scribe puts a working call to action in every signature, so the message you send to a passive candidate quietly points them toward your open roles, your careers page, and a link to book time with you.
Add a we're hiring banner, swap the featured role the moment a req closes, and watch where candidates click, all without asking a single recruiter to touch their settings.
## Why signatures belong in your sourcing toolkit
Recruiting runs on outreach. Sourcing emails, follow-ups, offer threads, referral asks, and scheduling notes flow out of your team constantly, and every one of them lands in the inbox of someone you want to impress. A candidate who is on the fence sees your employer brand in the signature long before they ever open your careers page.
Because these impressions reach people already in conversation with a recruiter, they are warm by default. On average, Scribe signature banners reach a 12% click-through rate. That turns routine outreach into a low-effort sourcing channel: candidates click through to a live job listing, a culture page, or your scheduling link without you sending a separate message.
## What you can put in a recruiter's signature
### We're hiring calls to action
Add a button or banner that links straight to your careers page, a specific open role, or your applicant tracking system. Every candidate email becomes a soft invitation to apply.
### Featured roles that change with your priorities
Promote your hardest-to-fill reqs right in the signature. When a role closes, swap in the next priority through [campaign banners](/en/marketing-overview), and the change rolls out across the whole team at once.
### Interview scheduling links
Give candidates a one-click path to book a screen or interview. Drop your scheduling link into the signature so the back-and-forth of finding a time disappears from your outreach.
### Employer brand and culture proof
Showcase an employee testimonial, a link to your culture page, or a "Best Places to Work" badge. Candidates get a feel for what it is like to work with you in the same message where you are pitching the role.
### Personal recruiter details, filled in for you
Each recruiter's signature carries their name, title, phone, photo, and booking link automatically. [Smart fields](/en/smart-fields) pull these from your directory or HRIS, so contact details stay correct without anyone editing a template.
## How do I keep the right roles in front of candidates?
Your outreach already reaches the right audience. Scribe makes sure the content in every signature reflects what you are hiring for this week.
### Rotate by hiring priority
Pushing engineering roles this quarter? Feature them. Shifting to go-to-market hiring next month? Update the banner once and it changes in every recruiter's signature immediately.
### Segment by desk or region
Assign different banners by focus area. Technical recruiters can surface engineering reqs while campus recruiters highlight internships and early-careers programs, each desk showing the most relevant role.
### See what candidates respond to
The [analytics dashboard](/en/analytics-overview) shows clicks and engagement per banner and per recruiter. You can tell which roles, which culture messages, and which recruiters drive the most traffic to your careers page, then double down on what lands.
## Set it up in under a day
Getting your recruiting team's signatures live takes less than a day. After setup, it runs on its own.
Link Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side) or [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side) environment. This one-time step lets Scribe deploy and manage signatures across the team. Both client-side and server-side install are supported (see the [Integrations overview](/en/integrations-overview)).
Use the [visual editor](/en/editor/editor-overview) to build an on-brand template with your logo, colors, social links, and a we're hiring call to action. Add [smart fields](/en/smart-fields) so each recruiter's name, title, phone, and photo populate automatically.
Create a [campaign banner](/en/marketing-overview) for an open role, your careers page, or a culture highlight. Start from a template or design your own, then set the call to action and destination URL.
Scribe imports recruiters from your provider directory, matches each one to the right template, and fills in their details. New hires on the team get picked up by future syncs.
Roll out signatures to the whole team in one move. Every recruiter gets their personalized signature with the banner included, and no one has to lift a finger.
## No IT tickets to update a banner
Hiring priorities move week to week, and waiting on IT to change a banner every time a req opens or closes is a non-starter.
After the one-time connection (which IT handles once), your recruiting or talent-brand lead manages everything from Scribe.
### Change banners on your own
Swap a featured role, update a careers link, or rotate culture content directly in Scribe. Changes deploy across the team instantly.
### New recruiters picked up automatically
When someone joins the team in your provider directory, the next sync deploys their signature with no extra work.
### Details stay current
When a recruiter changes desks or titles, their signature updates through directory sync or a quick [smart field](/en/smart-fields) edit.
## Banner ideas for recruiting teams
Not sure what to feature? A few starting points:
* **Priority roles.** Link a banner straight to the job listing or application page for your most urgent reqs.
* **Always-on careers page.** A persistent "View Open Roles" or "Join Our Team" button drives steady traffic to your careers site.
* **Interview scheduling.** A "Book a Call" link that lets candidates grab time without the email tag.
* **Employee testimonials.** A rotating quote from a current team member about working at your company.
* **Awards and ratings.** A "Best Places to Work" badge, Glassdoor rating, or industry recognition to build credibility.
* **Career fairs and events.** Promote upcoming recruiting events and webinars to drive registration through daily outreach.
* **Referral asks.** A "Know Someone?" banner pointing to your employee referral program.
## What recruiting teams gain with Scribe
* **A sourcing channel in every email.** Each signature points candidates toward roles, your careers page, or a scheduling link.
* **Instant updates.** New priority role? Change it once and it appears for every recruiter immediately, with no tickets.
* **Real visibility.** Track clicks, impressions, and engagement by campaign, desk, or individual recruiter.
* **A consistent employer brand.** Every recruiter sends a polished, on-brand signature, with no outdated logos or missing details.
* **Zero upkeep for recruiters.** Signatures deploy and update automatically, so the team just sends emails.
* **Renders everywhere.** Gmail, Outlook (web, desktop, mobile), Apple Mail, iOS, and Android all show the signature correctly.
## Related use cases
* [Email signatures for HR teams](/en/departments/email-signature-management-for-hr-teams)
* [Email signatures for marketing teams](/en/company-type/email-signature-for-marketing-teams)
## Get started today
Create your account and start turning recruiter outreach into a talent pipeline. Scribe offers a 14-day free trial with no credit card required, full feature access.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Email Signature Management for Customer Support Teams
Source: https://help.scribe-mail.com/en/departments/email-signature-management-for-support-teams
Deflect repeat tickets from the inbox your agents already live in. Put help center links, FAQs, and CSAT surveys in every support reply with Scribe.
A support agent's signature is the one piece of every reply that never changes, no matter the ticket. That makes it the quietest, most reliable surface your team owns. While the body of the email solves the problem in front of you, the signature can quietly point the customer toward the answer to their next question, before they have to open a second ticket to ask it.
Scribe lets you turn that surface into a self service channel. Put a help center link, a relevant FAQ, or a satisfaction survey at the foot of every reply, manage it centrally, and update it the moment your documentation changes. Your agents keep doing what they do best (closing tickets) while their signatures do the deflection work in the background.
## Why does the signature matter for a support queue?
Support is usually the highest volume sender in the company. A queue is a stream of one to one conversations with people who are already engaged, already mid problem, and already reading carefully. That is a rare kind of attention, and the signature sits in front of all of it.
The deflection logic is simple. Every customer who finds the answer in your help center is a ticket your team never has to touch. A persistent, well placed link in the signature nudges customers toward self service at exactly the moment they are thinking about your product. Over time it changes the habit: people learn to check the docs first.
On average, Scribe signature banners reach a 12% click-through rate. For a support queue, those clicks are not cold traffic. They come from customers actively working through an issue, which is precisely who you want landing on your knowledge base or leaving CSAT feedback.
## Which support resources belong in the signature?
### Help center and knowledge base
Add a clear "Visit our Help Center" button to every signature so customers always have a route to self service, even after the current ticket closes. Because it is the same on every reply, it becomes the default next step customers reach for.
### Trending FAQs and known issues
When a topic spikes in the queue, surface the matching article through a [campaign banner](/en/marketing-overview) and swap it out as trends shift. During a known outage or a buggy release, point the banner at your status page so agents stop fielding the same "is it down?" question all day.
### CSAT and NPS surveys
Drop a "Rate this conversation" link into every signature and collect feedback passively, without asking agents to remember a survey link or paste one in by hand. The prompt rides along on every reply automatically.
### The agent behind the reply
Each signature carries the agent's name, title, photo, and direct contact details. [Smart fields](/en/smart-fields) pull those from your directory, so a reply always looks like it came from a real person on your team and the details stay correct without anyone editing them.
### Shared inboxes in Front
If your team works out of [Front](/en/integrations/signatures/front-client-side), Scribe deploys the same branded, personalized signatures across every Front user. It connects, syncs, and updates exactly like the Google Workspace and Microsoft 365 integrations: change a banner in Scribe and it appears in Front straight away.
## Keep every link current without touching agent setup
Support documentation moves constantly: articles get rewritten, URLs change, new guides ship. The risk is signatures quietly pointing customers at dead links or stale answers.
Scribe centralizes that control. You edit the banner or the destination once, and the change deploys across every agent's signature at the same time. There is no per agent setup and nothing for individual agents to maintain.
### A team lead can own it, not just IT
After IT does the one time connection, your support leadership runs the rest. When a new help article goes live you can promote it that afternoon, and when a survey URL changes you update it once. No ticket to another team, no waiting on a deploy window.
### New agents are picked up automatically
When someone joins the team in your email provider directory or shared inbox, Scribe matches them to the support template on the next sync and deploys their signature. Role and team changes flow through directory sync or [smart field](/en/smart-fields) edits the same way.
## See which resources actually deflect
Not every link earns its place in the signature. Scribe's [analytics](/en/analytics-overview) show clicks and impressions by campaign, by team, and by individual agent, so you can tell which help articles and surveys customers engage with and which ones to retire. If a banner pointing at a particular guide gets steady clicks, that is a strong signal about where your documentation is doing real work, and where it has gaps worth filling.
## Set it up in under a day
Link Scribe to your [Google Workspace](/en/integrations/signatures/google-workspace-client-side), [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side), or [Front](/en/integrations/signatures/front-client-side) environment. This one time connection lets Scribe deploy and manage signatures across the support team. See every supported platform in the [Integrations overview](/en/integrations-overview).
Build a clean, professional template in the [visual editor](/en/editor/editor-overview): logo, brand colors, support contact details, and a call to action linking to your help center. Add [smart fields](/en/smart-fields) so each agent's name, title, and photo fill in on their own.
Create a [campaign banner](/en/marketing-overview) for your knowledge base, a high traffic FAQ, or a CSAT survey. Start from a template or design your own, then set the call to action and destination URL.
Scribe imports your support agents from the directory, matches each one to the template, and fills in their details automatically. Later joiners are caught by future syncs.
Roll signatures out to the whole team at once. Every agent gets their personalized signature with the banner included, and no agent has to lift a finger.
If you run multiple support functions (tier one, escalations, a billing desk), keep them in separate [workspaces](/en/workspaces) so each can run its own template and banners without stepping on the others.
## What support teams gain with Scribe
* **Ticket deflection on autopilot.** Every reply carries a route to self service, turning routine queue work into a steady deflection channel.
* **Passive CSAT and NPS.** Survey links ride along on every email, so feedback collection no longer depends on agents remembering.
* **Instant doc updates.** When a help article moves, you update the link once and it lands in every signature immediately.
* **Visibility into what works.** Clicks and impressions per campaign and per agent show which resources customers actually use.
* **Zero agent maintenance.** Signatures deploy and update centrally, so agents just answer tickets.
* **Consistent everywhere.** Scribe renders correctly across Gmail, Outlook (web, desktop, mobile), Apple Mail, iOS, and Android.
## Related use cases
* [Email Signature Management for Operations Teams](/en/departments/email-signature-management-for-operation-teams)
* [Email Signatures for IT Support Companies](/en/company-type/email-signature-for-it-support-companies)
## Get started today
Create a free account and start turning support replies into a deflection channel. Scribe offers a 14 day free trial with no credit card required, every feature included.
Visit [scribe-mail.com](https://scribe-mail.com) to get started.
# Do I need Scribe for email signature management?
Source: https://help.scribe-mail.com/en/do-i-need-scribe
See the email signature management problems Scribe solves, from manual installs to off-brand signatures, and decide whether it is right for your team.
## Email signature management wastes your time and costs you revenue opportunities.
You send instructions. Half your team ignores them. The other half installs it wrong. Everyone wastes time on manual work that can be automated.
You end up constantly asking IT for help, assuming they are available. Not their fault, everyone is asking for these shadow heroes.
Every broken signature, outdated logo, and missing social link damages your brand at scale. Your CEO notices. Your prospects definitely do.
A 50-person team sends 21K emails monthly. Without signature banners at 12% CTR, you're leaving 2,520 monthly clicks on the table and revenue loss.
## What changes with Scribe
| | Without Scribe | With Scribe |
| - | - | - |
| **Process** | Manual, less than 50% success rate | Automated, 100% success rate |
| **Signature editor** | No easy way to create signatures | [No-code editor](/en/editor/editor-overview) for easy creation |
| **Custom signatures** | Not practical at scale | By department, region, or role |
| **Installation & updates** | Manual setup per user | One-click deployment |
| **Teammate involvement** | Required for every change | None, fully transparent |
| **Email client compatibility** | Inconsistent rendering | All clients and browsers |
| **Installation rate** | Unpredictable | Guaranteed 100% |
| **Marketing channel** | Not possible | [Banners, CTAs, and campaigns](/en/marketing-overview) |
| **Analytics** | None | Track clicks and conversions |
| **Campaign scheduling** | Not possible | Schedule and rotate campaigns |
## Your other options
If you're evaluating alternatives, here's how the three paths compare.
| | Scribe | Competitors | In-House |
| - | - | - | - |
| **Time to value** | 1 to 7 days depending on organization size. Modern software designed for non-technical people, built for easy collaboration between IT and Marketing. | 2+ months depending on organization size. Legacy software made for technical people. Built for IT to handle initial setup and ongoing work. | 4+ months depending on organization size. Requires internal developer resources to build and maintain. Marketing still depends on IT for everything. |
| **Risks** | Low. Test Scribe for 14 days. No credit card, all features and unlimited users. No sales call required. Invite team for testing. Cancel anytime. | High. Prequalified sales calls. Endless IT/Marketing back-and-forth because the product is too complex. Discovering edge cases only after POC that make the platform unusable. | High. Find developer resources to commit long-term. Build a platform that handles signature design for all clients, integration with email and CRM tools, and monitoring. |
| **Long term results** | Team productivity gain and peace of mind. Marketing and IT enjoy using software that saves them time and does what it's supposed to do. | Team productivity loss. Marketing depends on IT for any brand or campaign updates. Complex software wastes your time. | Team productivity loss. Internal resources always required to improve and maintain. Marketing still depends on IT. |
| **Cost** | Cheaper than in-house, slightly more than competitors. The time you save makes up for it. | Cheaper than in-house and close to Scribe pricing. Your time and mental health is the real cost. | More expensive than Scribe and competitors. Developer time costs more than any software. |
## Is Scribe right for you?
**Scribe is for you if:**
* You've invested a lot into your brand but consistency is out of control
* Your team is wasting time installing signatures manually
* You are tired of broken signatures ruining all your branding efforts
* You can't track who has which signature installed
* IT is tired of being the bottleneck for every update
* Marketing can't update signatures without IT help
* Your current software is too complex for non-technical users
* You see email signatures as an [untapped marketing channel](/en/why-email-signatures)
* You want a solution that takes less than a day to implement
**Scribe is not for you if:**
* Brand consistency isn't a priority
* Your team is happy with the current manual process
* You don't send many external emails
* You think email signatures are just for contact information
* You love explaining to new hires how to set up their signature
* You like vendor lock-in
* You have internal resources to build and maintain an in-house solution
* You enjoy being on calls with Sales
* You'd rather attend training workshops than start using the product
## Related articles
* [Who is Scribe for?](/en/who-is-scribe-for): the marketing and IT teams Scribe is built for.
* [How long does it take to set up Scribe?](/en/how-long-does-it-take-to-set-up-scribe): the time to first deployment.
* [Install signatures](/en/install-signatures): how one-click deployment replaces manual installs.
* [ROI calculator](/en/roi-calculator): estimate the leads and time savings Scribe can deliver.
# Do teammates need to install their own email signature?
Source: https://help.scribe-mail.com/en/do-my-teammates-have-to-be-involved-to-install-their-email-signature
No. Scribe installs and updates email signatures centrally, so your teammates don't need to lift a finger. Learn how automatic deployment works.
No. With Scribe, your teammates don't need to take any action to get their email signature installed or updated. Everything is managed centrally by your Marketing or IT team.
Scribe uses cloud-based [integrations with Google Workspace, Microsoft 365 and Zoho Mail](/en/integrations-overview) to deploy email signatures directly to your teammates' email clients. They don't need to [copy-paste HTML](/en/integrations/signatures/signature-html), follow a tutorial, or change any settings. In most cases, they won't even notice Scribe is running.
This is one of the key differences between Scribe and manual email signature management, and one of the main reasons companies switch to a centralized solution.
## How email signatures are typically installed without Scribe
Without a centralized tool, installing email signatures across a team usually looks like this:
1. Someone designs the signature internally or hires a designer
2. The design is coded into HTML to make it compatible with email clients
3. A tutorial is sent to every teammate explaining how to paste the HTML into their email client settings
4. IT or Marketing spends time following up with teammates who haven't completed the installation
5. There is no reliable way to verify who has or hasn't installed the correct signature
This process needs to be repeated every time the signature is updated, whether for a new campaign, a rebrand, or even a simple phone number change. For companies with 100+ employees, it quickly becomes unmanageable.
## How Scribe handles email signature installation
With Scribe, the entire process is automated:
1. Marketing and IT manage email signatures from a single platform
2. Signatures are [installed and updated across your entire team](/en/install-signatures) with one click
3. Teammates don't need to do anything: no email, no tutorial, no manual steps
Once Scribe's integration is set up (a one-time 10-minute process handled by IT), Marketing can deploy and update signatures independently at any time. Changes take effect immediately across all connected email clients.
Scribe supports Google Workspace, Microsoft 365 and Zoho Mail. For Google Workspace and Microsoft 365, signatures can also be deployed server-side, which means they work across desktop, mobile, and web, without requiring any action from your teammates.
## Related articles
* [How long does it take to set up Scribe?](/en/how-long-does-it-take-to-set-up-scribe): the one-time setup behind automatic deployment.
* [Do Scribe email signatures work on mobile?](/en/do-scribe-email-signatures-work-on-mobile): how client-side and server-side affect mobile.
* [What if my teammates manually edit their signature?](/en/what-if-my-teammates-manually-edit-their-email-signature): how Scribe keeps signatures consistent.
# Do Scribe email signatures work on mobile?
Source: https://help.scribe-mail.com/en/do-scribe-email-signatures-work-on-mobile
Yes. Scribe signatures are responsive and work on mobile. Learn how client-side and server-side installation affect mobile compatibility.
Yes. Scribe email signatures are designed to be responsive and display properly on mobile devices. How they work on mobile depends on which installation method you use: client-side or server-side.
## Option 1: Client-side installation
With [client-side installation](/en/integrations-overview), the signature is installed directly within your teammates' email clients. Emails stay within your email provider and don't pass through any external server.
**Mobile compatibility with client-side installation:**
| Works on mobile | Doesn't work on mobile |
| - | - |
| Gmail iOS app | Gmail Android app |
| Outlook app for iOS and Android | Apple Mail app |
When someone sends an email from a desktop email client (Gmail web, Outlook desktop, etc.), the signature displays correctly on the recipient's mobile device regardless of their email app, because the signature is already embedded in the sent email.
The limitations above only apply to *composing* emails from mobile apps.
**Why some mobile apps aren't supported with client-side:**
Client-side installation relies on each email app supporting signature injection. Some mobile apps, like Gmail for Android and [Apple Mail](/en/integrations/signatures/apple-mail), don't allow external tools to modify the signature in the compose window, which is a technical limitation of those apps, not of Scribe.
## Option 2: Server-side installation
With [server-side installation](/en/integrations/signatures/google-workspace-server-side), Scribe automatically appends signatures to every email after it's sent, regardless of which device or app your teammates use. This means **full mobile compatibility** across all devices and email apps:
* Web (Gmail, Outlook)
* Desktop (Outlook, Apple Mail)
* iOS (Gmail, Outlook, Apple Mail)
* Android (Gmail, Outlook)
Server-side is the best option if mobile coverage across all apps is a priority for your team.
## How server-side works
Emails are routed through Scribe's secure servers where the signature is appended before delivery. Scribe cannot read or edit the content of your emails. The processing is limited to adding the signature.
You can also combine both methods: if both client-side and server-side integrations are connected, Scribe defaults to client-side so users can see their signature while composing. Server-side acts as a fallback for devices and apps where client-side isn't supported.
## Which option should I choose?
| | Client-side | Server-side |
| - | - | - |
| **Mobile coverage** | Partial, depends on email app | Full, all devices and apps |
| **Users see signature while composing** | Yes, signature is visible in the compose window | No, signature is appended after sending |
| **Email routing** | Emails stay within your email provider | Emails route through Scribe's secure servers |
| **Setup** | Standard, install from marketplace | Advanced, IT support required |
You can set up both integrations at the same time. Scribe will use client-side when available and fall back to server-side for unsupported apps, giving you the best of both worlds.
## Related articles
* [Are Scribe signatures compatible with all email clients?](/en/are-scribe-email-signatures-compatible-with-all-email-clients): rendering across clients and devices.
* [Gmail iOS app: signature not showing up](/en/troubleshooting/gmail-ios-app-signature-not-showing-up): fix a missing signature on the Gmail iOS app.
* [Do teammates need to install their own signature?](/en/do-my-teammates-have-to-be-involved-to-install-their-email-signature): how central deployment works.
# Action bar
Source: https://help.scribe-mail.com/en/editor/action-bar
Undo and redo edits, pan the infinite canvas with the hand tool, and adjust zoom from the action bar at the bottom of the signature editor.
The action bar sits at the bottom of the [editor](/en/editor/editor-overview) canvas. It gives you quick access to undo/redo, canvas navigation, and zoom controls.
## Undo and redo
* **Undo**: Revert your last change. Click multiple times to step back through your edit history.
* **Redo**: Restore a change you just undid.
## Hand tool
The hand tool lets you pan around the canvas without accidentally selecting or moving blocks. Activate it by clicking the hand icon, which highlights when active. Click it again to deactivate and return to the default selection mode.
The hand tool is especially useful when you're zoomed in and need to navigate to a different part of your signature without disturbing your layout.
## Zoom
* **−**: Zoom out to see more of your signature
* **100%**: Shows your current zoom level. Click to reset to 100%.
* **+**: Zoom in for detailed adjustments
The canvas is infinite, so you can zoom in and out freely to design at whatever level of detail you need.
## Related articles
* [Canvas](/en/editor/canvas)
* [Tree panel](/en/editor/tree-panel)
* [Editor top bar](/en/editor/editor-top-bar)
# Add blocks
Source: https://help.scribe-mail.com/en/editor/add-blocks
Explore the building blocks available in the Scribe signature editor, from contact info and layout elements to images, banners, and marketing CTAs.
Click **Add Block** at the bottom of the [tree panel](/en/editor/tree-panel) to open the block library. Blocks are organized into four categories.
## Information blocks
These blocks display contact and personal information, typically powered by [Smart Fields](/en/smart-fields) that pull data from your identity provider.
| Block | Description |
| - | - |
| **Name** | Teammate's full name (syncs from First name and Last name) |
| **Job title** | Teammate's role or position |
| **Phone** | Phone number |
| **Email** | Email address |
| **Address** | Physical address |
| **Website** | Company or personal website URL |
| **Text** | Free-form text. Use for anything not covered by other blocks |
| **List** | A list of items (e.g., certifications, office locations) |
| **Numbers** | Numeric data display |
| **Disclaimer** | Legal disclaimer or confidentiality notice |
| **Smart field** | A generic block connected to any Smart Field. Use when none of the specific blocks above match your data |
| **Sign off** | A closing message (e.g., "Kind regards", "Best wishes") |
## Layout blocks
These blocks control how your signature is structured. See [building layouts with columns and rows](/en/editor/building-layouts-with-columns-and-rows) for how to combine them.
| Block | Description |
| - | - |
| **Column** | A vertical container that stacks blocks on top of each other |
| **Row** | A horizontal container that places blocks side by side |
| **Divider** | A horizontal line to visually separate sections |
## Image blocks
Visual elements for your signature.
| Block | Description |
| - | - |
| **Profile picture** | Teammate's photo (can sync from your identity provider) |
| **Logo** | Company logo image |
| **Image** | Any custom image |
| **GIF** | An animated GIF |
| **Icon** | A small icon element |
## Marketing blocks
Interactive elements that drive engagement and link to external platforms.
| Block | Description |
| - | - |
| **Social** | Social media icons (LinkedIn, Twitter, Facebook, Instagram, etc.) |
| **Banner** | A campaign banner image with a clickable link |
| **Button** | A call-to-action button with custom text and link |
| **Store Apps** | App Store and Google Play download badges |
| **Product Hunt** | Product Hunt badge |
| **Y Combinator** | Y Combinator badge |
| **Podcast** | Links to podcast platforms (Apple, Spotify, etc.) |
| **Browser Store** | Chrome Web Store or other browser extension links |
| **Food Delivery** | Food delivery platform badges (Uber Eats, DoorDash, etc.) |
| **Game Store** | Gaming platform badges (Steam, Epic, etc.) |
| **Live Streaming** | Streaming platform links (Twitch, YouTube Live, etc.) |
| **Online Store** | E-commerce platform badges (Shopify, Etsy, etc.) |
| **Reading Apps** | Reading platform badges (Kindle, Audible, etc.) |
| **TV Streaming** | TV streaming badges (Netflix, Disney+, etc.) |
Start with the information blocks to build your core signature, use layout blocks to arrange them visually, then add marketing blocks for engagement. You can always rearrange, hide, or remove blocks later.
## Related articles
* [Text blocks](/en/editor/text-blocks)
* [Image blocks](/en/editor/image-blocks)
* [Button blocks](/en/editor/button-blocks)
* [Social icons](/en/editor/social-icons)
# Badge blocks
Source: https://help.scribe-mail.com/en/editor/badge-blocks
Add ready-made badges to your email signature, like App Store and Google Play buttons or certification logos, then set the link, size, and padding.
Badges are pre-designed visual elements like App Store download buttons, Google Play badges, certification logos, or award badges. Like [buttons](/en/editor/button-blocks), they link somewhere when clicked, but they come with built-in designs, so you just pick the one you want and add your link.
## Badge content
| Setting | What it does |
| - | - |
| **Link** | The URL the badge links to when clicked (for example, your App Store listing) |
| **App Store** | Select from available badge designs: multiple visual styles are available for each store |
The badge selector shows all available designs in a grid. Click to select the style that best matches your signature's look.
## Size
Set the badge **Width** and **Height** in pixels.
## Layout
Padding controls the space around the badge block.
## Related articles
* [Add blocks](/en/editor/add-blocks)
* [Image blocks](/en/editor/image-blocks)
* [Social icons](/en/editor/social-icons)
# Building Layouts with Columns and Rows
Source: https://help.scribe-mail.com/en/editor/building-layouts-with-columns-and-rows
Learn how to use columns and rows in Scribe's editor to create professional, well structured email signature layouts without any design experience.
Every email signature is made of two simple building blocks: **rows** and **columns**. Once you understand how they work together, you can create polished, professional layouts in minutes. No design background required.
## Think of It Like a Table
Imagine a simple table, like a spreadsheet. A **row** runs horizontally across the signature. A **column** divides that row into vertical sections, sitting side by side.
When you combine rows and columns, you create a grid. That grid is the skeleton of your signature. Everything you see in a well designed email signature (your photo next to your name, your social icons lined up in a row, a banner stretching across the bottom) is built on this grid.
## How Rows Work
A row is a horizontal container that stretches across the full width of your signature. Each row stacks on top of the next, from top to bottom. Think of rows like floors in a building: the first floor sits at the bottom, and each new floor goes above it.
In Scribe's [editor](/en/editor/editor-overview), you can add a new row by clicking the **Add Row** button. Each row you add creates a new horizontal section in your signature.
**Common uses for rows:**
A typical signature has two or three rows. The first row usually holds your main information (photo, name, title). The second row might contain a divider or your contact details. A third row could display a [campaign banner](/en/marketing-overview) or a legal disclaimer.
## How Columns Work
A column is a vertical division inside a row. When you add columns to a row, you split that row into side by side sections. This is what lets you place your headshot on the left and your name and title on the right, for example.
In the editor, select a row and click **Add Column** to split it. You can add up to four columns in a single row. Each column acts as its own container where you can drop in content blocks like text, images, icons, or [Smart Fields](/en/smart-fields).
**Common uses for columns:**
The most popular layout uses two columns in the first row: one narrow column for a profile photo and one wider column for your name, job title, company, and contact information. This is the classic "photo on the left, details on the right" signature that you see in most professional emails.
## Building Your First Layout
Here is a step by step walkthrough to build a common two column signature layout.
Open the [editor](/en/editor/editor-overview) and look at the default row. This is where your main identity block will live: your photo, name, and title.
Select the row and add a column. You now have two sections sitting side by side. The left column will hold your photo. The right column will hold your text details.
Click on the left column and insert an image block. Upload your headshot or company logo. Scribe will automatically resize it to fit the column.
Click on the right column and insert text blocks for your name, job title, company name, phone number, and email. You can also use [Smart Fields](/en/smart-fields) here so each teammate's information fills in automatically.
Click **Add Row** below the first row. This new row stretches across the full width of your signature. Use it for a [campaign banner](/en/marketing-overview), a row of social media icons, or a legal disclaimer.
## Layout Patterns That Work
You do not need to reinvent the wheel. Here are three layout patterns that cover the majority of professional email signatures.
### Pattern 1: Two Columns with a Full Width Banner
This is the most common layout. The first row has two columns (photo on the left, contact info on the right). The second row spans the full width and displays a campaign banner or a call to action.
This works well for teams that run [signature campaigns](/en/marketing-overview) because the banner gets maximum visibility beneath the contact block.
### Pattern 2: Three Columns
The first row uses three columns: a profile photo on the left, contact details in the center, and a company logo on the right. This pattern suits companies that want strong brand presence alongside individual contact information.
Keep the center column the widest so your text has room to breathe.
### Pattern 3: Stacked Rows, Single Column
Every row uses a single column, and content stacks vertically. Your name and title sit in the first row. Your contact info sits in the second. A banner sits in the third. This creates a clean, minimal look that works especially well on mobile devices where horizontal space is limited.
## Tips for Better Layouts
**Keep columns to two or three.** Four columns can work, but the more columns you add, the more cramped things look on smaller screens. Two columns is the sweet spot for most signatures.
**Use one row per "section" of your signature.** If your signature has a contact block, a social links bar, and a promotional banner, each of those deserves its own row. This keeps things organized and makes future edits easier.
**Let one column be wider than the other.** When you use two columns, give the text column more space than the image column. A 30/70 or 25/75 split usually looks best. In the editor, you can drag the column divider to adjust the ratio.
**Preview on mobile.** Email clients on phones display signatures differently than desktop clients. Use Scribe's preview feature to check that your columns and rows still look good on a smaller screen.
**Start simple and iterate.** Begin with two columns in one row. Once that looks right, add a second row for extra content. You can always add complexity later, but starting with too many rows and columns makes it harder to get things right.
## What Goes Where
If you are unsure what content belongs in which part of the grid, here is a quick reference:
**First row (two columns):** Profile photo or company logo in the narrow column. Full name, job title, company, phone, email, and website in the wider column.
**Second row (full width or two columns):** Social media icons, a meeting booking link, or a secondary line of contact details.
**Third row (full width):** A [campaign banner](/en/marketing-overview), a legal disclaimer, or a company tagline.
## Next Steps
Once your layout is in place, you can fine tune every detail in the [editor](/en/editor/editor-overview). Adjust fonts, colors, spacing, and icon styles to match your brand. If you manage signatures for a team, explore [Teammates](/en/teammates/teammates-overview) to roll out the same layout to everyone while keeping each person's contact information unique through [Smart Fields](/en/smart-fields).
# Button blocks
Source: https://help.scribe-mail.com/en/editor/button-blocks
Add clickable call-to-action buttons to your email signature, set the label and link, and style them with plain or stroke types, colors, and rounded corners.
Buttons are clickable calls-to-action like "[Book a demo](/en/can-i-add-a-book-a-demo-call-to-action-for-my-sales-team-email-signatures)", "Visit our website", or "Download our app." They stand out visually and drive clicks to your most important links.
## Button content
| Setting | What it does |
| - | - |
| **Text** | The label displayed on the button |
| **Link** | The URL the button links to when clicked. It can be [personalized per teammate](/en/editor/personalize-links) to prefill forms or track clicks |
## Style
| Setting | What it does |
| - | - |
| **Type** | **Plain** (solid background) or **Stroke** (outline only with transparent background) |
| **Color** | Button background color (for Plain) or border color (for Stroke) |
| **Border radius** | Corner rounding: `0` for sharp corners, higher values for rounded corners |
| **Color presets** | Quick-select from gradient and solid color presets for fast styling |
Use **Type → Plain** with your brand color for primary calls-to-action like "Book a demo." Use **Type → Stroke** for secondary actions that should be visible but less prominent.
## Text styling
Font, size, color, opacity, line height, and formatting options for the button label text.
## Size
Set the button's **Width** and **Height** in pixels.
## Layout
Padding controls the space around the button block.
## Related articles
* [Add blocks](/en/editor/add-blocks)
* [Personalize links with Smart Fields](/en/editor/personalize-links)
* [Social icons](/en/editor/social-icons)
* [Badge blocks](/en/editor/badge-blocks)
# Canvas
Source: https://help.scribe-mail.com/en/editor/canvas
Select, edit, reorder, and resize blocks directly on the canvas, the visual workspace inside the Scribe signature editor for designing signatures.
The canvas is the central area of the editor where you see and interact with your signature as it comes together. It works like a visual design tool: click to select, drag to reorder, and edit text inline, all while the tree panel and styling panel stay in sync.
## Selecting blocks
Click any block on the canvas to select it. A blue border appears around the selected block, and:
* The corresponding item highlights in the **tree panel**
* The **styling panel** on the right updates to show that block's settings
This works both ways. Clicking a block in the tree panel also selects it on the canvas and scrolls it into view.
For nested blocks (like a text element inside a column), click once to select the parent container, then click again to select the child block inside it.
## Editing text inline
For text blocks, you can edit content directly on the canvas. Click a text block to select it, then click again to place your cursor and start typing. You can select words or phrases to apply formatting from the styling panel.
When you're editing text inline, the styling panel shows text-level controls: font, size, color, line height, and formatting options (bold, italic, uppercase, strikethrough, underline).
Text blocks connected to a Smart Field (like Name or Job title) show the Smart Field value on the canvas. You can't edit the value itself here, since it's pulled from your data source. But you can still style how it appears.
## Adding rows and columns
Right-click any block on the canvas to open a context menu with two options: **Add Row** and **Add Column**. This lets you quickly group blocks together without leaving the canvas.
For example, if you want two buttons sitting side by side, select one of them, right-click, and choose **Add Column**. This wraps the selected block in a new column container, making it easy to drop another block next to it. Choose **Add Row** instead when you want to stack elements vertically within a shared container.
This is especially useful for building layouts like a row of social icons, a pair of call-to-action buttons, or any section where multiple blocks need to be grouped and aligned together.
## Reordering blocks
Drag any block on the canvas to reorder it within its container. As you drag, a dashed blue border shows where the block will land when you release.
You can also reorder blocks by dragging them in the tree panel. The result is the same.
## Resizing
Some blocks (like images) show resize handles (small blue squares) at the edges and corners when selected. Drag these handles to resize the block directly on the canvas. The exact dimensions update in real time in the styling panel.
## Navigating the canvas
The canvas is an infinite workspace. Use the [action bar](/en/editor/action-bar) at the bottom to zoom in and out, or activate the hand tool to pan around without accidentally selecting blocks.
# Containers and columns
Source: https://help.scribe-mail.com/en/editor/containers-and-columns
Arrange and space your email signature with containers, setting row or column direction, alignment, background, gap, and padding for every block inside.
When you select a container (like the main column or a row), the styling panel shows layout controls that affect everything inside it. Containers are the structural backbone of your signature: they determine how blocks are arranged and spaced. For a step-by-step walkthrough, see [building layouts with columns and rows](/en/editor/building-layouts-with-columns-and-rows).
## Layout
| Setting | What it does |
| - | - |
| **Direction** | Choose **Row** (elements side by side) or **Column** (elements stacked) |
| **Alignment** | Align content left, center, or right within the container |
| **Background** | Set a background color using the color picker or a hex code |
| **Gap** | Space between child elements inside the container |
| **Padding** | Space between the container edge and its content. Use the global input for equal padding on all sides, or expand to set Top, Right, Bottom, and Left individually |
Use **Direction → Row** combined with **Alignment → Center** to center elements horizontally. For example, centering social icons in a row.
## Text
When a container includes text content, the text section appears with font, size, color, opacity, line height, and formatting options. These settings apply as defaults to text inside the container.
| Setting | What it does |
| - | - |
| **Font** | Choose from [web-safe fonts](/en/which-fonts-can-i-use-in-my-scribe-email-signature): Helvetica, Arial, Arial Narrow, Tahoma, Georgia, Times, Garamond, Verdana, Lucida, Trebuchet |
| **Size** | Font size in pixels |
| **Color** | Text color: use the color picker or enter a hex code |
| **Opacity** | Text transparency (100% = fully visible) |
| **Line Height** | Space between lines of text |
| **Formatting** | Bold, Italic, Underline, Strikethrough, Uppercase |
## Related articles
* [Editor overview](/en/editor/editor-overview)
* [Styling panel](/en/editor/styling-panel)
* [Tree panel](/en/editor/tree-panel)
# Editor overview
Source: https://help.scribe-mail.com/en/editor/editor-overview
Tour the Scribe signature editor and see how the tree panel, canvas, styling panel, top bar, and action bar work together to build signatures.
The Scribe editor is where you design your email signatures. It follows a three-panel layout similar to design tools like Figma or Framer: a [tree panel](/en/editor/tree-panel) on the left, a [canvas](/en/editor/canvas) in the center, and a [styling panel](/en/editor/styling-panel) on the right.
## Layout
**Tree panel (left)**: Shows the hierarchical structure of your signature as a collapsible tree. Every block in your signature appears here: columns, text blocks, images, banners. You can select, reorder, duplicate, hide, and delete blocks from this panel.
**Canvas (center)**: A live preview of your signature that updates in real time as you make changes. Click on any block directly in the canvas to select it, or use the tree panel. The canvas shows actual teammate data from Smart Fields so you can see how the signature will really look.
**Styling panel (right)**: Appears when you select a block. Shows all the styling options for that block, including layout properties, text formatting, colors, spacing, and Smart Field connections. The options change depending on which type of block is selected.
## Top bar
The [top bar](/en/editor/editor-top-bar) shows key information and actions:
* **Back arrow**: Return to the signature detail page
* **Signature name and status**: Shows the signature name, number of assigned teammates, and current status (Draft or Published)
* **Templates**: Browse the template library to start from a pre-built design
* **Quality check**: Runs a compatibility check on your signature design. Click to see a checklist that verifies your signature adapts responsively to all screen sizes, works with all email clients and browsers, functions across desktop/mobile/tablet, loads quickly with lightweight HTML, displays correctly when composing emails, and maintains image proportions across all platforms. All checks should show green before publishing.
* **Preview**: Open the preview modal to see how the signature looks for each teammate
* **Publish**: Push your design changes live. After publishing, updates are automatically sent to all installed teammates.
## Action bar
At the bottom of the canvas, the action bar provides:
* **Undo / Redo**: Step backward or forward through your changes
* **Drag handle**: Reposition the canvas view
* **Zoom controls**: Zoom in (+), zoom out (−), or set a specific zoom level (e.g., 100%)
## Related articles
* [Action bar](/en/editor/action-bar)
* [Add blocks](/en/editor/add-blocks)
* [Building layouts with columns and rows](/en/editor/building-layouts-with-columns-and-rows)
# Editor top bar
Source: https://help.scribe-mail.com/en/editor/editor-top-bar
Preview your signature in Gmail, Outlook, and Apple Mail, run a quality check, apply templates, and publish changes from the editor top bar.
The top bar gives you quick access to the key actions you need while designing your signature. It stays visible at all times so you can switch between tasks without leaving the editor.
## Signature info
On the left side of the top bar, you'll see:
* **Back arrow**: Return to your signatures list
* **Signature name**: The name of the signature you're editing (e.g., "Marketing")
* **Teammates count**: How many teammates are assigned to this signature
* **Status badge**: Shows **Draft** if the signature has unpublished changes
## Actions
The right side of the top bar contains four actions, from left to right.
### Templates
Open the [template library](/en/editor/template-library) to browse pre-designed signature layouts. Pick a template and it applies to your current signature, and your existing Smart Field data fills in automatically.
### Quality check
Run an automatic check on your signature before publishing. This verifies that everything is properly configured: links are valid, images are loading, and Smart Fields are connected correctly.
### Preview
[Preview](/en/preview-signatures) shows you exactly how your signature will look in real email clients. The preview modal includes:
* **Teammate selector**: Browse and search your assigned teammates on the left to preview the signature with their specific data (name, photo, job title, etc.)
* **Email client tabs**: Switch between **Outlook**, **Gmail**, and **Apple Mail** to see how each client renders your signature
* **Light / Dark mode**: Toggle between light and dark mode to check both versions
* **Device views**: Preview on desktop, tablet, and mobile to verify your signature looks good across screen sizes
* **Send test email**: Send yourself a real email with the signature attached so you can see it in actual conditions, not just a preview
Always send a test email before publishing. Previews are close, but a real email in your inbox is the best way to catch spacing or image issues that only show up in specific email clients.
### Publish
When you're happy with your signature, click **Publish** to push the changes live. What happens when you click depends on your setup:
* **No integration connected**: You'll be prompted to connect an integration first. This redirects you to the [integration page](/en/integrations-overview) so you can set up Google Workspace, Microsoft 365, or another provider.
* **Integration connected but no teammates assigned**: You'll be prompted to assign teammates to this signature. This redirects you to the teammate tab of the signature.
* **Integration connected + teammates assigned**: A confirmation dialog appears: "Publish signature changes? This will update the signature for the teammates assigned to it." Click **Publish** to confirm or **Cancel** to go back.
Publishing updates the signature for all teammates assigned to it. Make sure you've previewed the signature with a few different teammates before publishing to catch any Smart Field issues.
## Related articles
* [Editor overview](/en/editor/editor-overview)
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature)
* [Action bar](/en/editor/action-bar)
# Google Workspace Directory
Source: https://help.scribe-mail.com/en/editor/google-workspace-directory
Connect your Google Workspace directory to Scribe to automatically sync teammates, keep contact information current, and assign signatures to users.
Connecting Google Workspace lets you import [teammates](/en/teammates/teammates-overview) directly from your company directory. Their profile information (name, job title, contact details) syncs automatically, so you don't have to enter data manually, and it stays up to date as changes happen in your directory.
## Before you start
You'll need **Super Admin** permissions on your Google Workspace account to complete the connection. If you don't have Super Admin access, you can invite someone from your IT team to complete this step for you. Scribe provides a built-in option to do this during the setup flow.
Scribe is SOC 2 Type II certified and only requests limited read access to your Google Workspace. Scribe cannot edit, delete, or send emails on your behalf.
## Connecting Google Workspace
There are two ways to start the connection: from the **+ Add Teammates** dropdown on the Teammates page (select "Google Workspace"), or from **Integrations → Teammates tab** where you'll find the [Google Workspace card](/en/integrations/teammates/google-workspace-teammates).
Both paths open the **Synchronize Teammates** setup flow, which walks you through the connection in a few steps:
**Step 1: Connect Google Workspace.** The modal explains what the integration does and gives you three expandable info sections to review before proceeding: the Super Admin role requirement, how teammate selection works, and Scribe's SOC 2 certification and data access policy. Click **Connect Google Workspace** to proceed, or **Invite a Super Admin** if someone else needs to complete this step.
**Step 2: Sign in with Google.** Choose the Google account you want to sync with Scribe, then sign in. You'll be asked to authorize Scribe's access, so review and accept the [requested scopes](/en/security/scopes-used-from-google-workspace). These are read-only permissions that allow Scribe to pull directory information.
**Step 3: Select teammates to sync.** This is where you choose exactly who gets imported. You don't have to sync your entire directory. Pick only the people who need email signatures. You can select teammates in three ways:
* **Teammates**: Browse and select individual people from your directory
* **Units**: Select entire organizational units to import all members at once
* **Groups**: Select Google Groups, which you can expand to see individual members before syncing
Use the search bar to find specific people, units, or groups. A "Select all" option is available if you want to import everyone.
At the bottom of the selection screen, two additional options let you fine-tune the sync:
* **Auto-sync new teammates added to Google Workspace**: When enabled, any new employee added to your Google Workspace directory will automatically appear in Scribe. This keeps your teammate list current without manual updates.
* **Import email aliases**: If your teammates have [email aliases](/en/how-do-scribe-email-signatures-work-with-email-aliases) (e.g., [support@company.com](mailto:support@company.com) in addition to their personal address), enable this to import those as well. The number of available domains is shown next to this option.
Click **Sync teammates** to start the import.
**Done!** A confirmation screen shows how many teammates were synced. Future updates in your Google Workspace directory (new employees, job title changes, etc.) will automatically sync with Scribe.
You don't need to import everyone at once. Start with a small group to test your setup, then come back and add more teammates later through the same flow.
## Inviting a Super Admin
If you don't have Super Admin access to Google Workspace, click **Invite a Super Admin** during the setup flow. Enter the email address of someone on your IT team who does have Super Admin access. They'll be added as an admin in your Scribe workspace so they can complete the Google Workspace connection for you.
## What happens after syncing
Once connected, Scribe automatically syncs your Google Workspace directory once per day based on your time zone. You can also trigger a manual sync at any time by clicking **Refresh** on the Teammates page.
Synced data flows one way, from Google Workspace to Scribe. If a teammate's name, job title, or other details change in your directory, those updates will appear in Scribe after the next sync. To change synced fields, update them in Google Workspace rather than in Scribe directly.
You can manage which teammates are synced at any time by clicking **Edit teammate selection** on the Teammates page.
## Related articles
* [Smart fields](/en/smart-fields)
* [Add teammates manually](/en/teammates/add-teammates-manually)
* [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id)
# Image blocks
Source: https://help.scribe-mail.com/en/editor/image-blocks
Add profile photos, logos, and banners to your email signature, then crop them, round the corners, set the size, and link the image to a URL.
Image blocks handle profile photos, company logos, banners, and any other visual element in your signature.
## Image source
Click **Select image** to upload a new image or pick one from your [image library](/en/editor/image-library).
The panel adapts to the image state:
* **Empty**: Shows a placeholder with a "Select image" button
* **Uploaded**: Shows the image preview with options to replace or adjust it
* **Profile picture**: When synced from Google Workspace, shows the Google icon indicating the image updates automatically for each teammate
For profile pictures synced from [Google Workspace](/en/editor/google-workspace-directory), the image updates automatically when a teammate changes their Google profile photo. You don't need to manage these manually.
## Link
Add a URL so the image becomes clickable, useful for linking a company logo to your website or a banner to a landing page. The link can be [personalized per teammate](/en/editor/personalize-links) to prefill the destination page or track who drives clicks.
## Style
| Setting | What it does |
| - | - |
| **Crop** | Open the crop tool to adjust the visible area of the image |
| **Radius** | Corner rounding in pixels: set to `0` for sharp corners, increase for rounded corners, or use a high value for a fully circular crop (great for profile photos) |
## Size
Set the **Width** and **Height** in pixels. These control the display size of the image in the signature.
For profile photos, try equal width and height with a high border radius for a clean circular look.
## Layout
Padding controls the space around the image block.
## Related articles
* [Add blocks](/en/editor/add-blocks)
* [Styling panel](/en/editor/styling-panel)
* [Badge blocks](/en/editor/badge-blocks)
# Image library
Source: https://help.scribe-mail.com/en/editor/image-library
Upload and organize signature images in the Image Library, sort them into folders, and edit with auto crop and background removal before adding them.
The Image Library is a shared asset manager for all images used in your signatures: logos, banners, profile pictures, and more. Open it by clicking **Update image** in the [styling panel](/en/editor/styling-panel) when an [image block](/en/editor/image-blocks) is selected.
## Uploading images
You can add images to the library in three ways:
* **Drag and drop** a file directly into the upload area
* **Select File** to browse your computer
* **Import from an external source**: Canva, Dropbox, Google Drive, OneDrive, Box, or SharePoint
Supported formats are JPEG, PNG, and GIF, with a maximum file size of 5 MB. Images are automatically resized to fit your signature, and you can fine-tune dimensions later in the styling panel.
For logos and icons, use PNG with a transparent background. This ensures your image looks clean regardless of the email client's background color.
## Organizing with folders
The left sidebar shows your folder structure. Use folders to keep assets organized. For example, separate folders for logos, banners, and campaign images.
* Click the **+** next to "Folders" to create a new folder
* Click the **pencil icon** on a folder to rename it
* Click the **trash icon** to delete a folder
* Folders can be nested. Use the **+** on an existing folder to create a subfolder
Click a folder to browse its contents. Use the **← Root** link to navigate back to the top level.
## Browsing and finding images
Once you have images in the library, the browsing toolbar helps you find what you need:
* **View mode**: Toggle between grid view (thumbnails) and list view (compact rows with details)
* **Sort**: Order images by Date (newest or oldest first), Name, or Size
* **Filter By**: Narrow results by file type: JPEG, PNG, or GIF
* **Search**: Type in the search bar to find images by name
## Image details and selection
Click an image to open its detail view. Here you can see:
* A large preview of the image
* **Image details**: name, dimensions, file size, upload date, creation date, and file type
From this view, you have three actions:
* **Select**: Use this image in your signature block
* **Edit image**: Open the image editor (see below)
* **Delete**: Remove the image from the library
## Editing images
Click **Edit image** to open the built-in editor, which offers two tools:
* **Auto Crop**: Automatically trims whitespace or empty areas around your image. Useful for cleaning up logos that have extra padding.
* **Remove Background**: Strips the background from your image, leaving only the foreground subject. Great for product images or headshots that need a transparent background.
You can also manually crop by dragging the blue handles to define the area you want to keep.
Click **Save** to apply your edits, or **Cancel** to discard them.
## Dark mode images
Email clients that support dark mode can invert or alter how images display. This behavior is controlled entirely by the recipient's email client, and there is currently no reliable technical way to provide a separate dark mode version of an image that all email clients will respect. For this reason, Scribe does not offer dark mode image variants.
The best approach is to upload images that look good in both light and dark mode.
Use logos and images that remain visible on any background. A logo with dark colors on a transparent background can become invisible in dark mode. To avoid this, use a version of your logo with a solid background, or choose a color variant that stays readable on both light and dark surfaces.
## Related articles
* [Editor overview](/en/editor/editor-overview)
* [Add blocks](/en/editor/add-blocks)
* [Template library](/en/editor/template-library)
# List blocks
Source: https://help.scribe-mail.com/en/editor/list-blocks
Show phone, email, and address details in your email signature with list blocks, choosing items per row, icon styling, dividers, and label formatting.
Lists display structured information like phone numbers, email addresses, and office locations. They combine an icon, a label, and a value into clean, scannable rows.
## Items per row
Choose between one, two, or three items per row depending on how much information you want to display and the available space in your signature.
* **One item per row**: Each piece of information on its own line. Best for short lists or when readability is the priority.
* **Two items per row**: Pairs information side by side. Good for saving vertical space with 4-6 items.
* **Three items per row**: Compact display. Works best when items have short values.
## Style
Each list item can display with an icon alongside the text. The icon styling options are the same as [social icons](/en/editor/social-icons):
| Setting | What it does |
| - | - |
| **Format** | Toggle between **Icon** (shows a visual icon) or **Text** (shows the label as text only) |
| **Variant** | Icon fill style: **Plain**, **Empty**, or **Stroke** |
| **Shape** | Icon container shape: **Square** or **Circle** |
| **Icon color** | Color of the icon |
| **Icon background** | Background color of the icon container |
| **Size** | Icon size in pixels |
## Text styling
Font, size, color, opacity, line height, and formatting options apply to the text content of each list item.
## Layout
| Setting | What it does |
| - | - |
| **Item Gap** | Space between list items |
| **Label Gap** | Space between a label (like "Phone") and its value |
| **Divider** | Add a visual separator between items: choose **None**, **Dot**, **Vertical**, or **Horizontal** |
| **Divider color** | Color of the divider when one is selected |
| **Padding** | Space around the entire list block |
## List labels
Labels like "Phone", "Email", or "Address" appear above or beside each list item value. Each label can have its own link and text styling, independent of the item values themselves.
This is useful when you want the label to be a different color or size than the value. For example, a lighter gray label with a dark value.
## Related articles
* [Add blocks](/en/editor/add-blocks)
* [Text blocks](/en/editor/text-blocks)
* [Styling panel](/en/editor/styling-panel)
# Personalize links with Smart Fields
Source: https://help.scribe-mail.com/en/editor/personalize-links
Add each teammate's details, like their name, email, or job title, to any link in your email signature. Prefill booking pages and forms automatically, or add UTM parameters to track who drives clicks.
Any link in a Scribe email signature (a button, an image, a social icon, or a text link) can carry personalized details about the teammate sending the email. Scribe adds these details to the end of the link's URL and fills them in automatically for every teammate, using their [Smart Fields](/en/smart-fields) data. Perfect for prefilling booking pages and forms, or tracking who drives clicks.
## How to personalize a link
1. In the editor, select the block that carries the link (a button, an image, a social icon, or a text selection) and open its **Link** field.
2. Click **Personalize this link** under the URL.
3. Add one or more details. Each detail has a **name** (what the destination page receives, e.g. `name` or `utm_content`) and one or more **values**: fixed text, or a Smart Field that fills in per teammate. Click **Add value** to combine several values in one detail, like a first name and a last name: Scribe joins them with a space.
4. Check **Your link will look like** to see the final URL, with Smart Fields shown as placeholders like `{First name}` and the joining space shown as `%20`.
5. Click **Save**.
The link's base URL can itself be a fixed URL or a Smart Field (like a personal booking link). Personalized details work with both.
## Example: prefill a booking page or form
Say your sales team's signatures have a **Book a call** button pointing to your scheduling page. Add these details so the booking form opens pre-filled with the sender's information:
| Detail name | Value |
| - | - |
| `name` | Smart Field → **First name** |
| `email` | Smart Field → **Email** |
Your link will look like `https://cal.example.com/acme?name={First name}&email={Email}`. When a prospect clicks the button in Jane's email, the booking page already knows they were talking to Jane: one less form to fill, fewer drop-offs, and the meeting lands with the right person. The same approach prefills contact forms, demo requests, and survey tools that accept URL parameters (most scheduling and form products do).
## Example: track who drives clicks with UTM parameters
To see in your analytics tool which teammate's signature drives traffic, add standard UTM parameters:
| Detail name | Value |
| - | - |
| `utm_source` | Text → `email-signature` |
| `utm_medium` | Text → `email` |
| `utm_content` | Smart Field → **First name**, then **Add value** → Smart Field → **Last name** |
Your link will look like `https://www.example.com/pricing?utm_source=email-signature&utm_medium=email&utm_content={First name}%20{Last name}`. Every click now arrives tagged with the campaign source and the full name of the teammate who sent the email, so your analytics tool can answer "which signatures convert?".
## How is this different from Scribe's built-in tracking?
Personalized link details and Scribe's analytics are **two different datasets**. Scribe measures your signatures and reports inside Scribe; personalized details are sent to your own tools and reported there. Neither replaces or changes the other.
Personalized details and Scribe's own tracking produce two separate, complementary datasets:
| | Scribe's built-in tracking | Personalized link details (UTM, etc.) |
| - | - | - |
| **Where the data lives** | Your Scribe dashboard: [signature analytics](/en/signature-analytics) and [conversion tracking](/en/conversion-tracking) | Your own tools: web analytics, CRM, scheduling or form product |
| **What it measures** | Views and clicks on your signatures, per signature, link, and recipient | Whatever your tool does with URL parameters: sessions, campaigns, form prefills |
| **Setup needed** | None, it works out of the box | Add the details your destination tool expects |
Adding personalized details never changes or replaces Scribe's tracking: both keep working on the same links, each feeding its own reports. Use Scribe analytics to compare signatures and campaigns inside Scribe, and personalized details to make signature traffic visible inside the tools your team already uses.
Because each side counts with its own rules, don't expect the two reports to show identical numbers. Scribe counts every click on the signature link itself, while your analytics tool applies its own sessions, filters, and consent handling. Treat each report as its own source of truth for what it measures.
## Good to know
* **One detail can combine several values.** Add as many values as you need to a detail (Smart Fields, fixed text, or a mix); Scribe joins them with a single space, encoded as `%20` in the URL.
* **Missing data never breaks a link.** If a teammate's Smart Field is empty, that value is simply left out. When every value of a detail is empty, the whole detail is left off their link, and the link still works.
* **Existing URL parameters are kept.** If the destination URL already contains parameters, your details are merged in, and a detail with the same name replaces the URL's own value.
* **Everything is encoded for you.** Spaces, accents, and special characters in values are safely encoded, so there is nothing to prepare.
* **Email and phone links can't be personalized.** Links to an email address (`mailto:`) or phone number (`tel:`) don't carry details.
## Frequently asked questions
### Can I add UTM parameters to my email signature links?
Yes. Open the link's **Personalize this link** option and add your UTM parameters as details: fixed text for `utm_source` and `utm_medium`, and a Smart Field (like First name) for `utm_content` to identify the teammate. Every signature gets the right values automatically.
### Can one parameter contain both the first name and the last name?
Yes. Add the detail (for example `utm_content` or `name`), bind its first value to the **First name** Smart Field, click **Add value** and bind the second one to **Last name**. The link then carries `utm_content={First name}%20{Last name}`, filled in per teammate. You can mix in fixed text too, and add as many values as you need.
### Can I prefill a Calendly, HubSpot, or Typeform page from an email signature?
Yes. Add details whose names match the parameters your scheduling or form tool accepts (for example `name` and `email`), and bind their values to Smart Fields. Each teammate's link then opens the page pre-filled with their own details.
### Does adding UTM parameters change or duplicate Scribe's click tracking?
No. Scribe's click tracking keeps working exactly as before, and your UTM parameters travel to your own analytics tool. They are two different datasets: Scribe reports signature performance in your Scribe dashboard, while UTM data appears in your web analytics. Their numbers can legitimately differ, since each tool counts with its own rules.
### What happens when a teammate doesn't have the data yet?
The personalized detail is skipped for that teammate and the link still points to the base URL. Once their Smart Field is filled in, manually or from a connected data source, their links pick it up automatically, without republishing anything by hand.
## Related articles
* [Smart Fields](/en/smart-fields)
* [Button blocks](/en/editor/button-blocks)
* [Signature analytics](/en/signature-analytics)
* [Conversion tracking](/en/conversion-tracking)
# Social icons
Source: https://help.scribe-mail.com/en/editor/social-icons
Add clickable social media icons to your email signature for LinkedIn, Instagram, and more, then style them by format, variant, shape, color, and size.
Social icon blocks let you display your social media profiles as clickable icons or text links. You can add them individually or as a group using the social list block.
## Icons grid
The icons grid shows all available social platforms: LinkedIn, Twitter, Facebook, Instagram, YouTube, Pinterest, Google, Vimeo, Snapchat, Behance, Figma, GitHub, and more.
Selected icons appear highlighted. Click the **+** button to browse the full library and search for specific platforms.
Each selected platform has a URL input where you enter your profile link.
## Style
| Setting | What it does |
| - | - |
| **Format** | Toggle between **Icon** (shows the platform logo) or **Text** (shows the platform name as a text link) |
| **Variant** | Icon fill style: **Plain** (solid fill), **Empty** (outline only), or **Stroke** (line-drawn) |
| **Shape** | Icon container shape: **Square** or **Circle** |
| **Icon color** | Color of the icon itself |
| **Icon background** | Background color of the icon container |
| **Size** | Icon size in pixels |
Use **Variant → Plain** with **Shape → Circle** for a modern, clean look. Switch to **Variant → Stroke** for a more minimal aesthetic.
## Layout
Padding controls the space around the social icons block.
## Social list vs. individual icons
The **social list** block groups all your social icons together with shared styling. Change the variant or shape once and it applies to every icon in the list.
An **individual social icon** block gives you independent control over a single icon's appearance. Use this when you want one icon styled differently from the others. [List blocks](/en/editor/list-blocks) use the same icon styling for contact details like phone and email.
## Related articles
* [Add blocks](/en/editor/add-blocks)
* [Button blocks](/en/editor/button-blocks)
* [Personalize links with Smart Fields](/en/editor/personalize-links)
* [Styling panel](/en/editor/styling-panel)
# Styling panel
Source: https://help.scribe-mail.com/en/editor/styling-panel
Style any signature block from the right-side styling panel, with content, style, size, and layout sections plus padding, brand colors, and link controls.
The styling panel is where you control the look and feel of your email signature. Select any block on the canvas, and the panel on the right updates to show all available options for that element.
Think of it like a design tool: click on something, style it on the right.
The options you see depend on the block you've selected. A text block shows font and color settings. An [image block](/en/editor/image-blocks) shows size and crop options. Each block type has its own set of controls.
## How it works
The styling panel is organized into consistent sections that appear depending on the block type:
* **Content settings**: What the block contains (text values, Smart Field connections, image source, links)
* **Style**: How it looks (colors, fonts, formatting, icon variants)
* **Size**: Dimensions when applicable (width, height)
* **Layout**: How it sits in the signature (padding, gap, alignment, direction)
Not every block has all four sections. A simple [text block](/en/editor/text-blocks) might only show content and style settings, while a [container block](/en/editor/containers-and-columns) focuses on layout and alignment.
When no block is selected, the panel shows "Add or select a block to start editing." Click any element on the canvas or add a new block from the left panel to begin.
***
## Common controls
These controls appear across multiple block types and work the same way everywhere.
### Padding
Every block has padding controls in its Layout section. Padding is the space between the block's edge and the surrounding elements.
You can set padding globally (one value for all sides) or expand the control to set each side individually: Top, Right, Bottom, Left.
### Color picker
Anywhere you see a color field, clicking it opens the color picker with:
* A color gradient selector for visual picking
* A hue slider for selecting the base color
* A hex input for entering exact color values
* Your **Brand Colors** at the bottom for quick access to your company's color palette
### Brand colors
Brand colors are shared across all your signature templates. Editing a brand color updates it everywhere it's used. Change your brand blue once, and every signature using that color updates automatically.
You can add new brand colors with the **+** button directly from the color picker.
### Links
Most blocks support links. The link input accepts any URL and makes the block clickable in the final signature, useful for driving traffic to your website, booking page, or social profiles.
## Related articles
* [Editor overview](/en/editor/editor-overview)
* [Add blocks](/en/editor/add-blocks)
* [Canvas](/en/editor/canvas)
# Template library
Source: https://help.scribe-mail.com/en/editor/template-library
Browse the Scribe template library of professionally designed email signatures organized by industry and apply one to start customizing in seconds.
The Template Library gives you a collection of ready-made signature designs with different layouts. Instead of building from scratch, pick a template that fits your brand and customize it in the editor. All templates can be customized as much as needed.
Open the template library by clicking **Templates** in the [top bar](/en/editor/editor-top-bar).
## Previewing a template
Click a template card to open a detailed preview. From here you can:
* **Toggle light / dark mode**: See how the template looks on both light and dark backgrounds
* **Switch between Template and Signature preview**: "Template" shows the design with sample data, while "Signature preview" shows how the template looks with the information you've already added to your signature, so you can see exactly what the result will look like before applying it
* Review the **template features**: Each template is fully customizable, dark mode compatible, responsive, compatible with all email clients, and optimized for fast loading
## Selecting a template
When you've found a template you like, click **Select this template** to apply it to your signature. The template replaces your current layout and design, but your existing data (names, contact details, social links, and other information) carries over automatically. You can then customize every visual element in the editor: colors, fonts, images, and structure.
Use the "Signature preview" toggle before selecting a template to see it with your actual data. This way you can be confident the layout works for your content before committing.
# Text blocks
Source: https://help.scribe-mail.com/en/editor/text-blocks
Add names, titles, and contact text to your email signature, style the font and color, and connect Smart Fields that fill in each teammate's details.
Text blocks are used for names, job titles, phone numbers, email addresses, and any other text in your signature.
## Smart Fields
If the text block is connected to a [Smart Field](/en/smart-fields) (like First Name or Last Name), you'll see the Smart Field connection at the top of the panel. Smart Field values sync from your data source (Google Workspace, Microsoft 365, or Scribe's internal fields) and populate automatically for each teammate.
Smart Field values synced from an external source like Google Workspace can't be edited directly in the panel. They update from the source. To change which data populates a field, click the input icon to switch the data source.
### Connecting a Smart Field
Click **Connect Smartfield** to link any text block to a data field. The panel shows two categories:
* **External Data Source**: Fields from Google Workspace, Microsoft 365 or Zoho Mail (like First Name, Last Name, Meeting link)
* **Internal Data Source**: Fields you manage directly in Scribe (like Phone number, Calendly link, Licenses)
To disconnect a Smart Field, click **Unlink Smartfield**.
## Text styling
| Setting | What it does |
| - | - |
| **Font** | Choose from [web-safe fonts](/en/which-fonts-can-i-use-in-my-scribe-email-signature): Helvetica, Arial, Arial Narrow, Tahoma, Georgia, Times, Garamond, Verdana, Lucida, Trebuchet |
| **Size** | Font size in pixels |
| **Color** | Text color: use the color picker or enter a hex code |
| **Opacity** | Text transparency (100% = fully visible) |
| **Line Height** | Space between lines of text |
| **Formatting** | Bold, Italic, Underline, Strikethrough, Uppercase |
## Link
When a text block has a link attached (like an email address or website URL), the link field appears with a URL input. This makes the text clickable in the final signature. Web links can be [personalized per teammate](/en/editor/personalize-links) to prefill the destination page or track who drives clicks.
## Layout
Gap and padding controls let you adjust spacing around the text block.
## Related articles
* [Add blocks](/en/editor/add-blocks)
* [Styling panel](/en/editor/styling-panel)
* [Containers and columns](/en/editor/containers-and-columns)
# Tree panel
Source: https://help.scribe-mail.com/en/editor/tree-panel
Navigate and manage your signature structure with the tree panel in Scribe: select, reorder, duplicate, hide, and delete blocks with full visibility.
The tree panel on the left side of the editor shows the full structure of your signature as a collapsible hierarchy. It works like a layer panel in design tools: every block in your signature is represented as a node in the tree.
## Structure
A signature is built from nested blocks:
* **Main Column**: The root container of your signature. It cannot be deleted (indicated by the lock icon). All other blocks live inside it.
* **Columns**: Layout containers that hold content blocks. You can nest multiple columns to create side-by-side layouts (for example, a logo column next to a text column).
* **Content blocks**: Individual blocks like Name, Job title, Address, Logo, Banner, and more.
Click the arrow next to any column to expand or collapse its children. This makes it easy to navigate complex signatures with many nested blocks.
## Select a block
Click any block in the tree to select it. The corresponding block is highlighted on the canvas, and the styling panel on the right updates to show that block's properties.
You can also click directly on a block in the canvas, and the tree panel will highlight the corresponding block.
## Block actions
Hover over any block in the tree to reveal action icons:
* **Duplicate**: Create a copy of the block
* **Hide**: Toggle the block's visibility on or off without deleting it. Hidden blocks remain in the tree but don't appear in the final signature. This is useful for temporarily removing an element without losing its configuration.
* **Smart Field indicator** (purple pin icon): Shows that the block is connected to a Smart Field and pulls data dynamically for each teammate
Blocks connected to Smart Fields show a tooltip on hover explaining the data source. For example, the Name block shows *"Syncs from First name and Last name"*.
## Reorder blocks
Drag and drop blocks within the tree to reorder them. You can move blocks between columns or change their position within a column. The canvas updates in real time as you rearrange.
The Main Column is locked and cannot be moved or deleted. It's the root container that holds your entire signature structure.
## Delete a block
Select a block and press **Delete** on your keyboard, or right-click to delete. Deleting a column also deletes all blocks inside it.
## Add blocks
Click the **Add Block** button at the bottom of the tree panel to open the block library. See the [Add blocks](/en/editor/add-blocks) article for the full list of available blocks.
# Filter and search signatures
Source: https://help.scribe-mail.com/en/filter-and-search-signatures
Find the right signature in Scribe quickly using search and filters. Narrow by design status, teammate assignment, or installation state in seconds.
As your workspace grows, filters and search help you find the right signature quickly, whether you're looking for a draft that needs finishing, a signature with [no teammates assigned](/en/assign-teammates-to-a-signature), or one that [failed to install](/en/install-signatures).
## Search
Use the search bar at the top of the Signatures page to find a signature by name. Results update as you type.
## Filters
Click the **filter icon** next to the search bar to open the filter menu. You can filter by three categories:
**Design** filters signatures by their design status:
* **Published**: signatures with a design that is live and visible to assigned teammates
* **Draft**: signatures with a design that is still being worked on and not yet published
**Teammates** filters signatures by teammate assignment:
* **Assigned**: signatures that have at least one teammate assigned to them
* **Not assigned**: signatures that have no teammates assigned yet
**Installation** filters signatures by installation status:
* **Installed**: signatures that are installed in your teammates' email clients
* **Not installed**: signatures that have not been installed yet
You can combine filters with the search bar to narrow down results even further. For example, you can search for a signature name and only show published signatures that are not installed yet.
## Signature status
Filters can be combined across categories. For example, you can filter for signatures that are in Draft status *and* have teammates assigned, to quickly find signatures that are ready to publish.
Use filters to audit your workspace. For example, filter by "Not assigned" to find signatures that aren't being used, or by "Not installed" to spot signatures that still need to be deployed.
## Related articles
* [Signatures overview](/en/signatures-overview): how the Signatures page is organized.
* [Signature status](/en/signature-status): what the design, teammate, and installation indicators mean.
* [Create and manage signatures](/en/create-and-manage-signatures): create, duplicate, and organize signatures into folders.
# Home overview
Source: https://help.scribe-mail.com/en/home-overview
Your Scribe dashboard at a glance. See the status of your signatures, teammates, integrations, campaigns, and analytics, all from one screen.
The Home screen is your central dashboard in Scribe. It gives you a quick overview of everything happening in your workspace: how many signatures you've created, how many teammates are connected, which Smart Fields are in use, which integrations are active, and how your campaigns are performing.
Each card on the Home screen links directly to its dedicated section so that you can jump into any part of Scribe with one click.
## What each card shows
**Signatures**: The number of signatures created in your workspace, with a preview of your most recent one. Click to create, edit, or manage your signatures.
**Teammates**: The number of teammates added to your workspace. Click to add new teammates, sync from your email provider, or manage existing profiles.
**Smart Fields**: The number of Smart Fields currently used in your signatures. Smart Fields are dynamic fields that automatically personalize each signature with individual teammates' information, such as name, job title, or phone number. The data can come from an external source (synced from your Google Workspace, Microsoft Entra ID or Zoho Mail directory) or managed internally using Scribe as your database. Click to configure them.
**Integrations**: The number of integrations connected (for example Google Workspace, Microsoft 365 or Zoho Mail). Click to connect a new integration or manage existing ones.
**Campaigns**: The number of campaigns currently running. Campaigns let you add promotional banners to your signatures and schedule them over time. Click to create or manage campaigns.
**Analytics**: A snapshot of your signature performance: total views, clicks, and click-through rate (CTR). Click to access detailed analytics and track the impact of your signatures and campaigns.
Create and manage your email signatures
Add and manage your team
Configure dynamic signature fields
Connect Google Workspace, Microsoft 365 or Zoho Mail
Schedule promotional banners
Track signature performance
# Remove the Scribe watermark from your email signatures
Source: https://help.scribe-mail.com/en/how-can-i-remove-the-scribe-watermark-from-my-email-signatures
The 'Made with Scribe' watermark appears on the free plan and during the free trial. Upgrade to any paid plan to remove it automatically from all signatures.
The "Made with Scribe" watermark appears below your email signatures when you're on the free plan or during the free trial. Upgrade to any [paid plan](/en/pricing) and the watermark is automatically removed from all your signatures, with no manual action needed.
# How do Scribe email signatures work with email aliases?
Source: https://help.scribe-mail.com/en/how-do-scribe-email-signatures-work-with-email-aliases
Each user can have unlimited email aliases with their own signature. Scribe charges per user, not per signature, so aliases don't cost extra.
Each user in Scribe can have one signature for their primary email and unlimited signatures for their email aliases. Scribe charges per user, not per signature, so additional aliases don't increase your costs.
## What is an email alias?
An email alias is an alternative email address that forwards to a primary account. For example, someone might use both `jane@company.com` and `support@company.com` from the same inbox. Each alias can have its own dedicated signature in Scribe.
## How it works
When you assign a signature to an alias, it appears automatically when composing an email from that alias in Gmail or Outlook. Your teammates don't need to do anything. The right signature shows up based on which "From" address they select.
## Setting up aliases in Scribe
**If you sync teammates from your email provider:**
Scribe automatically imports email aliases from your [Google Workspace](/en/integrations/teammates/google-workspace-teammates) or [Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) directory. Any alias configured in your provider will be available in Scribe without manual setup.
**If you manage teammates manually:**
1. Go to your teammates list
2. Click the edit icon next to the teammate's name
3. In their profile page, click **"Add an email alias"** at the bottom
Once the alias is added, you can assign a specific signature template to it, just like you would for a primary email address.
This is useful for teams where people send from multiple addresses (like `sales@`, `support@`, or `info@`) and need a different signature for each context.
# How long does it take to set up Scribe?
Source: https://help.scribe-mail.com/en/how-long-does-it-take-to-set-up-scribe
Most teams set up Scribe in under 30 minutes. Learn what's involved in deployment and how fast you can roll out email signatures across your company.
Most teams get Scribe fully set up and their first email signatures deployed in under 30 minutes. The fastest customers complete the entire process in about 10 minutes.
## What the setup involves
Setting up Scribe takes you through five steps:
1. **Create your account**: sign up and access the platform
2. **Design your signature**: use the no-code editor to create a template that matches your brand identity
3. **Sync your teammates**: connect your Google Workspace, Microsoft 365 or Zoho Mail directory to import team members automatically
4. **Connect an integration**: install the cloud-based add-on that lets you deploy signatures remotely
5. **Install signatures**: deploy your new signatures across your team with a single click
A dedicated "Get Started" guide is available inside your account to walk you through each step.
## What affects setup time
The main factor is who is doing the setup and what access they have.
If the person configuring Scribe holds an admin role on Google Workspace, Microsoft 365 or Zoho Mail, the entire process can be completed in as little as 10 minutes, because they have the permissions needed to connect integrations and sync the team directory without waiting on anyone else.
For larger organizations where Marketing and IT need to coordinate (for example, if Marketing designs the signatures but IT handles the integration setup), the process takes a bit longer due to the back-and-forth. But once that coordination is sorted, the technical setup itself rarely exceeds 30 minutes.
## How the work is typically split
| Role | What they do | Time |
| - | - | - |
| **IT** | Connect email provider, install integration, configure custom domain | \~10 minutes |
| **Marketing** | Design signatures, assign to teammates, deploy | \~15 to 20 minutes |
After the initial setup, Marketing can manage everything independently: updating signatures, launching campaigns, and deploying changes without needing IT again.
Want to see the full setup process? Check out our [Getting Started guide](/en/how-to-set-up-your-scribe-workspace) for a step-by-step walkthrough.
# How to set up your Scribe workspace
Source: https://help.scribe-mail.com/en/how-to-set-up-your-scribe-workspace
Get your team's email signatures live in under 10 minutes. Follow the step-by-step setup for Google Workspace, Microsoft 365, Zoho Mail, or manual installation.
Setting up Scribe takes under 10 minutes. The setup process depends on your email provider. Scribe automatically detects it when you sign up and shows you the right steps.
There are two paths:
* **Automated** (Google Workspace, Microsoft 365 or Zoho Mail): signatures are deployed centrally. No action needed from your teammates.
* **Manual** (other email providers): teammates receive an invitation to install their signature themselves.
## Automated setup for Google Workspace, Microsoft 365 and Zoho Mail
This is the recommended path. You manage everything centrally, and your teammates don't need to do anything. They might not even notice Scribe is running.
Sync your team directory from Google Workspace, Microsoft Entra ID or Zoho Mail. Scribe imports your teammates' names, email addresses, job titles, and other profile information automatically. You can also add teammates manually if needed.
Select which signature template each teammate (or group of teammates) will use. You can assign different signatures by department, role, or location.
Connect Scribe to your email provider to enable automatic signature installation. This is a one-time step that requires admin access to your Google Workspace, Microsoft 365 or Zoho Mail account.
Click **Install Signatures** to centrally deploy signatures to all your teammates instantly. Once installed, Scribe will automatically keep signatures up to date. Any future changes you make in Scribe are pushed to your team without any manual steps.
Total setup time: approximately **9 minutes**. After this, Marketing can update signatures independently at any time without needing IT again.
Learn how to sync or manually add your team
Set up Google Workspace, Microsoft 365 or Zoho Mail
## Manual setup for other email providers
If your company doesn't use Google Workspace, Microsoft 365 or Zoho Mail, you can set up Scribe manually. With this path, your teammates will need to take action. They'll receive an invitation to install their signature.
Sync from your email provider or add teammates manually with their name, email address, and profile information.
Select which signature template each teammate will use. You can assign different signatures by department, role, or location.
Click **Invite Teammates** to send an email invitation. Your teammates will be guided through a simple process to install their Scribe signature in their email client (such as Apple Mail or Outlook desktop). No technical knowledge required on their end.
Total setup time: approximately **7 minutes** for you, plus a few minutes for each teammate to accept the invitation and install their signature.
Learn how to sync or manually add your team
## What happens after setup?
Once signatures are installed, Scribe runs in the background:
* **Automated path:** any change you make in Scribe is automatically pushed to your teammates' email clients. No reinstallation needed.
* **Manual path:** when you update a signature, teammates receive a new invitation to install the updated version.
If you use Google Workspace, Microsoft 365 or Zoho Mail but chose the manual path initially, you can switch to the automated path at any time by connecting an integration. There's no need to start over.
# Install signatures
Source: https://help.scribe-mail.com/en/install-signatures
Deploy email signatures to your team: install all signatures at once from the Signatures page, or one by one from each signature's overview.
Once your signatures are designed, [teammates are assigned](/en/assign-teammates-to-a-signature), and [an integration is connected](/en/integrations-overview), you're ready to install. Scribe gives you two ways to deploy signatures to your team.
## Install all signatures at once
Click the **Install Signatures** button in the top-right corner of the Signatures page. This opens the installation modal, which shows every signature in your workspace with its current status.
For each signature you can see:
* **Signature name** and number of teammates assigned
* **Status**: Installed, Partially installed, Not installed, Pending, or Failed
* **Integrations**: Which integrations are connected (for example Google Workspace, Microsoft 365 or Zoho Mail)
* **Last installed**: When the signature was last deployed
* **Actions**: Install or uninstall individual signatures
Select one or more signatures using the checkboxes, then click **Install X signatures** at the bottom to deploy them all at once.
If no integration is connected yet, the modal will prompt you to connect one before you can install. Click **Connect Integration** to set it up.
## Install one signature at a time
Click on any signature card to open its overview page. From there, the **Setup** panel on the right guides you through the steps:
1. **Publish signature updates**: Make sure your latest design changes are published
2. **Assign teammates**: Select which teammates will use this signature
3. **Connect an integration**: Enable automatic installation
Once all steps are complete, you can install the signature directly from this page.
This approach is useful when you're setting up a new signature and want to go through the full workflow step by step, rather than bulk-installing from the main page.
## Notify teammates
At the bottom of the Install Signatures modal, you can check **"Notify teammates via email about their new signature"** to automatically send an email to your teammates letting them know their signature has been updated.
The email includes a preview of their new signature, the name of the admin who deployed it, and which email client it applies to. It also reassures them that no action is needed on their part. The signature will appear automatically when they compose their next email.
This saves you from having to manually notify your team via Slack, Teams, or email every time you roll out a signature update.
## Installation statuses
| Status | Meaning |
| - | - |
| **Installed** | Signature successfully deployed to all assigned teammates |
| **Partially installed** | Some teammates have the signature, but not all (e.g., "2/3") |
| **Not installed** | Signature hasn't been deployed yet |
| **Pending** | Installation request sent, waiting for Google or Microsoft to process it. This is handled on their end, not by Scribe. It usually completes within a few minutes. Zoho Mail installs at once, so it never shows Pending. |
| **Failed** | Installation encountered an error. Check the integration connection |
## Uninstall a signature
From the Install Signatures modal, click the **✕** button next to any signature to uninstall it from your teammates' email clients.
After the initial installation, any design changes you publish are automatically pushed to your teammates, so you don't need to reinstall. The Install Signatures modal is mainly for the first deployment, adding new teammates, or [troubleshooting failed installations](/en/troubleshooting/signature-not-appearing).
## Related articles
* [Signatures overview](/en/signatures-overview): where installation fits in the signature workflow.
* [Signature installation statuses and errors](/en/signature-installation-statuses-and-errors): what each status means and how to resolve errors.
* [Signature status](/en/signature-status): read installation progress from the signature card.
* [Preview signatures](/en/preview-signatures): verify each teammate's signature before you deploy.
# Scribe integrations: deploy signatures and sync teammates
Source: https://help.scribe-mail.com/en/integrations-overview
Connect Scribe with your email provider, directory, HRIS, and business tools to automate signature deployment, teammate syncing, and smart field data.
Scribe integrates with your email provider, directory, HRIS, and business tools to automate every aspect of email signature management. Instead of manually updating signatures or collecting employee information, integrations keep everything in sync automatically.
There are three types of integrations in Scribe, each serving a different purpose.
Prefer to manage signatures and integrations by chatting with an AI assistant? Connect the [Scribe MCP server](/en/ai-agents) to Claude, ChatGPT, Cursor, and more.
## Signature integrations
Signature integrations connect Scribe to your email provider to deploy and update signatures across your organization. Depending on your email provider, you can choose between three deployment methods.
### Automated - Client Side
Admin activates integration and installs signatures for all teammates. Emails stay within your email provider, so they're never routed through external servers.
### Automated - Server Side
Admin setup for all teammates. One integration for all email clients and devices. Emails route through Scribe for signature processing.
Server-side is an advanced feature. IT support is required to set up this integration.
* Users don't see signatures when composing an email.
* Your emails are processed through Scribe's secure servers to install signatures. Scribe cannot read or edit your emails.
* You can combine client-side and server-side integration. If both are connected, Scribe defaults to client-side so users can see their signatures when composing emails.
### Manual
Each teammate activates integration and installs their own signature. Emails stay with your email provider.
**Not sure which method to choose?** Client Side is recommended for most teams. It gives you centralized control with one-click deployment, teammates can see their signature when composing emails, and emails never leave your provider.
## Teammate integrations
Teammate integrations sync your organization's directory with Scribe so teammate information stays up to date automatically. When someone joins, leaves, or changes role in your directory, Scribe reflects those changes without manual updates.
## Smart Field integrations
Smart Field integrations auto-fill your teammates' signature fields using data from your existing business tools. Instead of manually entering phone numbers, job titles, or calendar links for each teammate, Scribe pulls this information directly from the source.
### HRIS
Auto-fill your teammate's signatures using your HRIS as a data source.
### Business Phone System
Auto-fill your teammate's signatures using your business phone system as a data source.
### Calendar
Auto-fill your teammate's signatures using your calendar system as a data source.
### Sales Execution
Auto-fill your teammate's signatures using your sales execution system as a data source.
# Apple Mail
Source: https://help.scribe-mail.com/en/integrations/signatures/apple-mail
Install Scribe email signatures on Apple Mail in minutes by downloading the Scribe desktop app and turning on the integration on your Mac.
Follow the steps below to [install your signatures](/en/install-signatures) in Apple Mail.
**Each user has to install and configure the integration.**
**Users see signatures when composing emails.**
**Cloud-based installation.** Emails don't go through Scribe servers.
## Installation guide
### Prerequisites
* A Scribe account
* At least one signature created in Scribe
* macOS with Apple Mail installed
You can also configure the Apple Mail integration using our server-side integration if you want to [centrally manage the installation](/en/integrations/signatures/apple-mail-rmm) versus having each teammate install the Scribe desktop app.
Download the Scribe desktop app from the integrations page.
Log in to the Scribe app just as you do on Scribe's website.
Click the settings wheel and activate Apple Mail.
Click on the 'All signatures' tab. Then, drag your Scribe signature to the linked email account.
In the 'choose your signature' field, pick your Scribe signature.
From your signatures list, install all signatures at once for your teammates or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Images are not showing](/en/troubleshooting/images-are-not-showing): fix missing images in installed signatures.
* [Unable to install signature](/en/troubleshooting/unable-to-install-signature): fix a signature that will not install.
# Apple Mail (Remote Monitoring)
Source: https://help.scribe-mail.com/en/integrations/signatures/apple-mail-rmm
Deploy Scribe signatures across your whole team's Apple Mail at once by pushing the Scribe desktop app silently through your RMM tool.
Follow the steps below to install your signatures on [Apple Mail](/en/integrations/signatures/apple-mail).
**Each user has to install and configure integration.**
**Users see signatures when composing emails.**
**Cloud-based installation.** Emails don't go through Scribe servers.
## Advanced Installation
This is an advanced user feature. IT support is required to set up this integration.
Use the Scribe DMG with any remote monitoring and management tool:
```text theme={null}
https://scribe-mail.com/desktop-app/mac-installer/latest
```
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
* [Unable to install signature](/en/troubleshooting/unable-to-install-signature): fix a signature that will not install.
# Front
Source: https://help.scribe-mail.com/en/integrations/signatures/front-client-side
Install Scribe email signatures across your team's Front in one click by connecting the integration as a Front admin, no teammate action needed.
**Centralized one-click installation.** No teammate action needed. Users see signatures when composing emails. Cloud-based installation: emails don't go through Scribe servers.
**Supported platforms:** Web
## Installation guide
You must be an **Admin in Front** to install this integration.
Click **Connect Front** in Scribe to start the integration.
If you are already logged in, this step will be skipped.
Once you authorize, the integration connects automatically.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Google Workspace](/en/integrations/signatures/google-workspace-client-side): one-click cloud install for Google Workspace.
* [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side): one-click cloud install for Microsoft 365 and Outlook.
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
# Google Workspace
Source: https://help.scribe-mail.com/en/integrations/signatures/google-workspace-client-side
Install Scribe email signatures across your team's Google Workspace in one click by adding the Scribe add-in as a super admin, no teammate action needed.
**Centralized one-click installation.** No teammate action needed. Users see signatures when composing emails. Cloud-based installation: [emails don't go through Scribe servers](/en/integrations/signatures/google-workspace-server-side).
**Supported platforms:** Web, iOS
## Installation guide
You must be a **Super admin** of your Google Workspace to install the Scribe App.
Get the Scribe App from the Google Workspace Marketplace.
Click **Install Scribe App** in Scribe to open the Google Workspace Marketplace.
Make sure to select "Everyone at your organization" and "I agree to the application terms of service."
The validation usually takes a few seconds. If not, make sure to check the troubleshooting list in the modal.
Once you get the validation modal, click "Install signature" to go to your Scribe signatures list.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side): one-click cloud install for Microsoft 365 and Outlook.
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
# Google Workspace (Server Side)
Source: https://help.scribe-mail.com/en/integrations/signatures/google-workspace-server-side
Add Scribe signatures to your team's Google Workspace emails automatically from any device by routing outbound mail through Scribe's secure servers.
**Centralized one-click installation.** No teammate action needed. Users don't see signatures when composing emails. Your emails are processed through Scribe's secure servers for signature injection.
**Supported platforms:** Web, Desktop, Apple Mail, iOS, Android
## How it works
Server-side installation changes your mail routing, not your teammates' mailboxes. Nothing is installed on their devices, and no add-in runs in their email client. Instead, the setup below adds one hop to your outbound mail flow, and the signature is added to each message while it is in transit.
1. **A teammate sends an email.** Gmail accepts it from whatever client or device they used, so the same rule covers web, desktop, Apple Mail, iOS and Android. Tools that send through a teammate's mailbox are covered too: HubSpot sales emails, and any other CRM or sequencer connected to Gmail, pick up the signature with no extra setup, as long as the From address belongs to a teammate whose signature you have installed. A tool that sends from its own servers instead of through Gmail, such as HubSpot marketing email, never reaches this rule and gets no signature.
2. **Google Workspace routes the message to Scribe.** The content compliance rule you create below matches outbound and internal-sending mail and routes it to the Scribe host, `smtp.server.scribe-mail.com`, over TLS.
3. **Scribe adds the signature.** Scribe inserts the teammate's published signature, choosing the right [variant](/en/signature-variants) for the context, then re-signs the message so it still authenticates after the change, and stamps it with an `X-Scribe-Processed` header.
4. **The message returns to Google Workspace.** Scribe hands it back through the SMTP relay service, which is configured to accept connections only from Scribe's two IP addresses and only over TLS.
5. **Google Workspace delivers it.** The `X-Scribe-Processed` header stops the compliance rule matching a second time, so the message goes out to the recipient the same way any other message does.
Scribe adds the signature and its own headers: `X-Scribe-Processed`, a routing header telling the relay where to hand the message back, a refreshed `DKIM-Signature`, an ARC chain, and the `Content-Type` matching the rewritten body. Your recipients, subject, attachments and the text your teammate wrote are passed through unchanged.
## Installation guide
This is an advanced user feature. IT support is required to set up this integration.
* Users don't see signatures when composing an email.
* Your emails are processed through Scribe's secure servers to install signatures. Scribe cannot read or edit your emails.
* You can combine [cloud-based integration](/en/integrations/signatures/google-workspace-client-side) with server-side integration. If both are connected, Scribe defaults to cloud-based integration so users can see their signatures when composing emails.
To route emails through Scribe's secure servers, create a host in Google Workspace Gmail. In Google Admin, go to **Apps → Google Workspace → Gmail**, then click 'Hosts'.
Fill in the form with the following info:
**a. Name:** Scribe
**b. Select:** "Single host"
**c. Host name or IP:**
```text theme={null}
smtp.server.scribe-mail.com
```
**d. Port:** 25
**e. Select:** the options like in the screenshot below
To receive emails back from Scribe for routing to recipients, go to **Apps → Google Workspace → Gmail** in Google Admin, then click 'Routing'.
On the next page, click **Configure** under "SMTP relay service".
Fill in the form with the following information:
**a. Description:** Receive from Scribe
**b. Authentication:** Check "Only accept mail from the specified IP addresses" Add:
```text theme={null}
15.236.243.144
```
and
```text theme={null}
51.44.50.107
```
**c. Select:** "Require TLS encryption"
**d. Click:** "Save"
In Google Admin, go to **Apps → Google Workspace → Gmail**, then click 'Compliance'.
On the next page, click **Configure** under "Content compliance".
Fill in the form as shown in the screenshot:
**a. Description:** Route to Scribe
**b. Select:** "Outbound" and "Internal - sending" in "Email messages to affect"
**c. In the second configuration item ("Add expressions…"),** set the matching to **"If ALL of the following match the message"**, then click **ADD** and add these two Advanced content match expressions:
* Location: Full headers, Match type: Does not contain text, Content: `X-Scribe-Processed`. This prevents processing your email multiple times.
* Location: Envelope sender, Match type: Does not match regex, Regexp: `.*@google\.com$`. This excludes system mail such as Google Forms receipts (from [forms-receipts-noreply@google.com](mailto:forms-receipts-noreply@google.com)), which Google's SMTP relay rejects if routed through Scribe.
**d. In the third configuration item,** change the route to the host you created in part 1 of this guide.
**e. Select:** "Require secure transport (TLS)"
**f. Click:** "Save"
In the Compliance rule expression modal, add the info as shown in the screenshot:
Advanced content match:
* **Location:** Full headers
* **Match type:** Not contains text
* **Content:** X-Scribe-Processed
Configure DKIM for your [sending domains](/en/configure-your-sending-domain) to keep emails out of spam folders and avoid missing assets such as images and links.
Click **Configure DKIM** in Scribe to start the configuration.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## IT and security FAQ
Questions that come up most often when an IT team reviews this integration.
Only what the content compliance rule matches: outbound mail and internal-sending mail from your organization. Two exclusions are built into the rule when you fill in the Content compliance form.
* Messages whose full headers already contain `X-Scribe-Processed`, so nothing is processed twice.
* Messages whose envelope sender matches `.*@google\.com$`, which covers Google system mail such as Google Forms receipts. Google's SMTP relay rejects that mail if it is routed through Scribe.
Inbound mail from outside your organization is never routed to Scribe.
Yes, in both directions, and the setup enforces it. The compliance rule uses **Require secure transport (TLS)** when it hands mail to Scribe, and the SMTP relay service uses **Require TLS encryption** when Scribe hands it back.
Outbound, your mail flow connects to the Scribe host on port 25:
```text theme={null}
smtp.server.scribe-mail.com
```
Inbound, Scribe returns processed mail from two fixed IP addresses, which are the only ones the SMTP relay service is configured to accept:
```text theme={null}
15.236.243.144
51.44.50.107
```
It affects DKIM, and the **Configure DKIM** step in the guide is what handles it. Inserting a signature changes the message body, which invalidates the DKIM signature Google Workspace applied before the message left. Scribe therefore re-signs the message on the way back out.
Once DKIM is configured, two things are added to every processed message:
* **A fresh `DKIM-Signature`**, signed with a key Scribe generates for your domain and published as a `scribe._domainkey` record. It covers the `From`, `To`, `Cc`, `Subject` and `Message-ID` headers along with the body.
* **An ARC chain** ([RFC 8617](https://datatracker.ietf.org/doc/html/rfc8617)): `ARC-Authentication-Results`, `ARC-Message-Signature` and `ARC-Seal`. These record the authentication results the message carried when Scribe received it, so a receiving server can tell that an authorized intermediary modified it rather than reading the change as tampering.
SPF is unaffected, because Google Workspace still performs the final delivery and the message reaches your recipient from Google's own sending infrastructure.
Re-signing only happens once your DKIM record is validated, which is why the guide treats that step as required rather than optional. Skip it and your recipients receive mail whose original signature no longer verifies.
Two things. Scribe stamps every message it handles with an `X-Scribe-Processed` header, and the content compliance rule matches only messages whose full headers do **not** contain it, so a message coming back from Scribe no longer matches and is delivered normally.
As a second guard, Scribe checks whether the body already carries the signature before inserting one. A message that reaches it twice still goes out with a single signature.
Because the signature is added after the message leaves the mailbox, not in the compose window. For the same reason, the copy saved in the sender's Sent folder is the version from before Scribe processed it, so it does not show the signature either. The recipient always receives the full signature.
If compose visibility matters to your teams, connect the [cloud-based integration](/en/integrations/signatures/google-workspace-client-side) as well. When both are connected, Scribe defaults to cloud-based so teammates see their signature while writing, and server side keeps covering the clients that cloud-based cannot reach.
Yes, if you publish them. [Signature variants](/en/signature-variants) work with server-side installation, and Scribe picks one as it processes each message:
* **On-reply**, when the subject starts with a reply or forward prefix such as `Re:`, `Fw:` or `Fwd:`, including the localized equivalents.
* **Internal**, when every recipient is on the same domain as the sender.
* **Primary** in every other case.
Scribe inserts the signature, re-signs the message and hands it straight back to Google Workspace. It does not act on what your teammates write: the recipients, the subject, the attachments and the body text are passed through unchanged.
Scribe's controls around this are verified as part of its [SOC 2 Type II process](/en/what-scribe-does-concerning-security). See [Product security](/en/security/product-security) and [Infrastructure security](/en/security/infrastructure-security) for the detail your security review will ask for, or the [Trust Center](https://security.scribe-mail.com) for the certifications themselves.
Disable the content compliance rule in Google Admin. Mail then leaves Google Workspace directly again, with no Scribe hop and no signature added. The host and SMTP relay entries can stay in place, unused, until you decide whether to remove them.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Microsoft 365 (server side)](/en/integrations/signatures/microsoft-365-server-side): route mail through Scribe for all-device coverage.
* [Signature variants](/en/signature-variants): on-reply and internal variants for Outlook and server side.
# Microsoft 365
Source: https://help.scribe-mail.com/en/integrations/signatures/microsoft-365-client-side
Install Scribe email signatures across your team's Microsoft 365 and Outlook in one click by deploying the Scribe add-in as a global admin.
**Centralized one-click installation.** No teammate action needed. Users see signatures when composing emails. Cloud-based installation: [emails don't go through Scribe servers](/en/integrations/signatures/microsoft-365-server-side).
**Supported platforms:** Web, Desktop, iOS, Android
## Installation guide
You must be a **Global Admin** of your Microsoft 365 to install the Scribe Add-in.
Get the Scribe Add-in from the Microsoft App Source.
Click **Install Scribe Add-in** in Scribe to open the Microsoft App Source.
You'll be redirected to your Microsoft 365 admin dashboard. If redirected to Outlook Inbox instead, you're not a Global Admin, and the add-in won't work.
Choose which users get the add-in. Select "**Entire organization**" unless you want to test with a small group first, then click "Next".
Accept the permissions in the pop-up that opens.
After granting permissions, click "Next".
The add-in will now be deployed in your Microsoft 365 account and across all Outlook instances for your users.
Microsoft can take up to 72 hours to install the Scribe Add-in across your organization. You will be notified by email when it's done. If the validation is too long, make sure to check the troubleshooting list in the modal.
Once you get the validation modal, click "Install signature" to go to your Scribe signatures list.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Google Workspace](/en/integrations/signatures/google-workspace-client-side): one-click cloud install for Google Workspace.
* [Signature variants](/en/signature-variants): on-reply and internal variants for Outlook and server side.
# Microsoft 365: Server Side
Source: https://help.scribe-mail.com/en/integrations/signatures/microsoft-365-server-side
Set up server-side email signature deployment for Microsoft 365. Emails route through Scribe's secure servers to add signatures from any device or client.
Server-side installation automatically adds signatures to emails from any device or client.
**Centralized one-click installation.** No teammate action needed. Users don't see signatures when composing emails. Your emails are processed through Scribe's secure servers for signature injection.
**Supported platforms:** Web, Desktop, Apple Mail, iOS, Android
## How it works
Server-side installation changes your mail routing, not your teammates' mailboxes. Nothing is installed on their devices, and no add-in runs in their email client. Instead, the setup below adds one hop to your outbound mail flow, and the signature is added to each message while it is in transit.
1. **A teammate sends an email.** Exchange Online accepts it from whatever client or device they used, so the same rule covers web, desktop, Apple Mail, iOS and Android. Tools that send through a teammate's mailbox are covered too: HubSpot sales emails, and any other CRM or sequencer connected to the mailbox, pick up the signature with no extra setup, as long as the From address belongs to a teammate whose signature you have installed. A tool that sends from its own servers instead of through Exchange Online, such as HubSpot marketing email, never reaches this rule and gets no signature.
2. **Exchange Online routes the message to Scribe.** The mail flow rule you create below matches senders located inside your organization and redirects them to the outbound connector, which routes to the smart host `smtp.server.scribe-mail.com` over TLS.
3. **Scribe adds the signature.** Scribe inserts the teammate's published signature, choosing the right [variant](/en/signature-variants) for the context, then re-signs the message so it still authenticates after the change, and stamps it with an `X-Scribe-Processed` header.
4. **The message returns to Exchange Online.** Scribe hands it back through the inbound connector, which is configured to accept connections only from Scribe's two IP addresses.
5. **Exchange Online delivers it.** The `X-Scribe-Processed` header matches the rule's exception, so the rule does not fire a second time and the message goes out to the recipient the same way any other message does.
Scribe adds the signature and its own headers: `X-Scribe-Processed`, a routing header telling the relay where to hand the message back, a refreshed `DKIM-Signature`, an ARC chain, and the `Content-Type` matching the rewritten body. Your recipients, subject, attachments and the text your teammate wrote are passed through unchanged.
## Installation guide
This is an advanced user feature. IT support is required to set up this integration.
* Users don't see signatures when composing an email.
* Your emails are processed through Scribe's secure servers to install signatures. Scribe cannot read or edit your emails.
* You can combine [cloud-based integration](/en/integrations/signatures/microsoft-365-client-side) with server-side integration. If both are connected, Scribe defaults to cloud-based integration so users can see their signatures when composing emails.
### Prerequisites
* **Microsoft 365 admin access** (Exchange admin center)
* At least one signature created in Scribe
The setup involves four parts: creating an outbound connector, creating an inbound connector, creating a mail flow rule, and configuring DKIM.
To route emails through Scribe's secure servers, create an outbound connector in your Exchange admin. In the Exchange admin interface, go to **Mail flow → Connectors** and click **"Add a connector."**
Select **"Office 365"** for connection from and **"Partner organization"** for connection to.
Enter a connector name and description. Optionally, check **"Turn it on"** to enable immediately.
* **Name:** `Scribe signature outbound`
* **Description:** `Scribe signature outbound`
Select **"Only when I have a transport rule set up that redirects messages to this connector."**
Select **"Route email through these smart hosts"** and add the following host to the list:
```text theme={null}
smtp.server.scribe-mail.com
```
Select **"Always use Transport Layer Security (TLS) to secure the connection (recommended)"**, then:
**a.** Select: **"Issued by a trusted certificate authority (CA)."**
**b.** Check: **"Add the subject name or subject alternative name (SAN) matches this domain name."**
**c.** Enter the following in the field:
```text theme={null}
smtp.server.scribe-mail.com
```
Enter the following as the test email and start the validation:
```text theme={null}
scribe-o365-test@scribe-mail.com
```
Sometimes the validation fails, but you can safely continue without validating.
In your Exchange admin interface, go to **Mail flow → Connectors** and click **"Add connector."** Select connection from **"Your organization's email server"** (connection to will be set to Office 365 automatically).
Enter a name and description. You can also check **"Turn it on"** to enable the connector immediately.
* **Name:** `Scribe signature inbound`
* **Description:** `Scribe signature inbound`
Select **"By verifying that the IP address of the sending server matches one of the following IP addresses, which belong exclusively to your organization."**
Add the two following IPs to the list:
```text theme={null}
15.236.243.144
```
```text theme={null}
51.44.50.107
```
In your Exchange admin interface, go to **Mail flow → Rules**.
**a.** Click **"Add a rule"**
**b.** Click **"Create a new rule"**
Fill in the rule form as follows:
* **Name:** `Route outbound mail via Scribe Signature`
* **Apply this rule if:** The sender → is external/internal → The sender is located "InOrganization"
* **Do the following:** Redirect the message to → the following connector → select **"Scribe signature outbound"**
* **Except if:** The message headers → match these text patterns → `X-Scribe-Processed` message header matches `Processed`
The exception prevents Scribe from processing your emails multiple times.
On the next step, you can leave the rule settings as is. Review your rule and save it. From the rules list, select your rule and enable it.
Configure DKIM for your [sending domains](/en/configure-your-sending-domain) to keep emails out of spam folders and avoid missing assets such as images and links.
Click **Configure DKIM** in Scribe to start the configuration.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## IT and security FAQ
Questions that come up most often when an IT team reviews this integration.
Only what the mail flow rule matches: messages whose sender is located `InOrganization`. Mail arriving from outside your tenant is never redirected to Scribe.
The rule also carries one exception, set when you fill in the rule conditions: messages already stamped with the `X-Scribe-Processed` header are skipped, so nothing is processed twice.
Yes, in both directions, and the setup enforces it. The outbound connector uses **Always use Transport Layer Security (TLS)**, requires a certificate issued by a trusted certificate authority, and checks that the subject name or SAN matches `smtp.server.scribe-mail.com`. The inbound connector accepts mail back only from Scribe's own IP addresses.
Outbound, the connector routes to the Scribe smart host:
```text theme={null}
smtp.server.scribe-mail.com
```
Inbound, Scribe returns processed mail from two fixed IP addresses, which are the only ones the inbound connector is configured to accept:
```text theme={null}
15.236.243.144
51.44.50.107
```
It affects DKIM, and the **Configure DKIM** step in the guide is what handles it. Inserting a signature changes the message body, which invalidates the DKIM signature Exchange Online applied before the message left. Scribe therefore re-signs the message on the way back out.
Once DKIM is configured, two things are added to every processed message:
* **A fresh `DKIM-Signature`**, signed with a key Scribe generates for your domain and published as a `scribe._domainkey` record. It covers the `From`, `To`, `Cc`, `Subject` and `Message-ID` headers along with the body.
* **An ARC chain** ([RFC 8617](https://datatracker.ietf.org/doc/html/rfc8617)): `ARC-Authentication-Results`, `ARC-Message-Signature` and `ARC-Seal`. These record the authentication results the message carried when Scribe received it, so a receiving server can tell that an authorized intermediary modified it rather than reading the change as tampering.
SPF is unaffected, because Exchange Online still performs the final delivery and the message reaches your recipient from Microsoft's own sending infrastructure.
Re-signing only happens once your DKIM record is validated, which is why the guide treats that step as required rather than optional. Skip it and your recipients receive mail whose original signature no longer verifies.
Two things. Scribe stamps every message it handles with an `X-Scribe-Processed` header, and the mail flow rule carries an exception for messages whose headers match it, so a message coming back from Scribe no longer triggers the redirect.
As a second guard, Scribe checks whether the body already carries the signature before inserting one. A message that reaches it twice still goes out with a single signature.
Not necessarily. Microsoft's validation sends a probe message to `scribe-o365-test@scribe-mail.com` and it does not always complete, even when routing is correct. You can save the connector and continue. Confirm the setup instead by sending a real email once the mail flow rule is enabled and checking that the recipient sees the signature.
Because the signature is added after the message leaves the mailbox, not in the compose window. For the same reason, the copy saved in the sender's Sent Items folder is the version from before Scribe processed it, so it does not show the signature either. The recipient always receives the full signature.
If compose visibility matters to your teams, connect the [cloud-based integration](/en/integrations/signatures/microsoft-365-client-side) as well. When both are connected, Scribe defaults to cloud-based so teammates see their signature while writing, and server side keeps covering the clients that cloud-based cannot reach.
Yes, if you publish them. [Signature variants](/en/signature-variants) work with server-side installation, and Scribe picks one as it processes each message:
* **On-reply**, when the subject starts with a reply or forward prefix such as `Re:`, `Fw:` or `Fwd:`, including the localized equivalents.
* **Internal**, when every recipient is on the same domain as the sender.
* **Primary** in every other case.
Scribe inserts the signature, re-signs the message and hands it straight back to Exchange Online. It does not act on what your teammates write: the recipients, the subject, the attachments and the body text are passed through unchanged.
Scribe's controls around this are verified as part of its [SOC 2 Type II process](/en/what-scribe-does-concerning-security). See [Product security](/en/security/product-security) and [Infrastructure security](/en/security/infrastructure-security) for the detail your security review will ask for, or the [Trust Center](https://security.scribe-mail.com) for the certifications themselves.
Disable the mail flow rule in the Exchange admin center. Mail then leaves Exchange Online directly again, with no Scribe hop and no signature added. The two connectors can stay in place, unused, until you decide whether to remove them.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Google Workspace (server side)](/en/integrations/signatures/google-workspace-server-side): route mail through Scribe for all-device coverage.
* [Signature variants](/en/signature-variants): on-reply and internal variants for Outlook and server side.
# Outlook Mac
Source: https://help.scribe-mail.com/en/integrations/signatures/outlook-mac
Install Scribe email signatures on Outlook for Mac by downloading the Scribe desktop app, made for users without a Microsoft 365 cloud license.
Follow the steps below to install your signatures on Outlook Mac.
**Each user has to install and configure integration.**
**Users see signatures when composing emails.**
**Cloud-based installation.** Emails don't go through Scribe servers.
## Installation guide
### Prerequisites
* A Scribe account
* At least one signature created in Scribe
* macOS with Outlook installed
This integration is only required for users who don't have a Microsoft 365 cloud license. Use our [Microsoft 365 integration](/en/integrations/signatures/microsoft-365-client-side) instead for complete automation.
Download the Scribe desktop app from the integrations page.
Log in to the Scribe app just as you do on Scribe's website.
Click the settings wheel and activate Outlook.
Set the Scribe signature as default for new messages and replies/forwards.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Outlook Mac (Remote Monitoring)](/en/integrations/signatures/outlook-mac-rmm): push the Outlook Mac install through your RMM tool.
* [Switch to the new Outlook](/en/troubleshooting/switch-to-new-outlook-version): move signatures to the new Outlook.
# Outlook Mac (Remote Monitoring)
Source: https://help.scribe-mail.com/en/integrations/signatures/outlook-mac-rmm
Deploy Scribe signatures across your whole team's Outlook for Mac at once by pushing the Scribe desktop app silently through your RMM tool.
Follow the steps below to install your signatures on [Outlook Mac](/en/integrations/signatures/outlook-mac).
**Each user has to install and configure integration.**
**Users see signatures when composing emails.**
**Cloud-based installation.** Emails don't go through Scribe servers.
## Advanced Installation
This is an advanced user feature. IT support is required to set up this integration.
Use the Scribe DMG with any remote monitoring and management tool:
```text theme={null}
https://scribe-mail.com/desktop-app/mac-installer/latest
```
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
* [Microsoft 365](/en/integrations/signatures/microsoft-365-client-side): one-click cloud install for Microsoft 365 and Outlook.
# Outlook Windows
Source: https://help.scribe-mail.com/en/integrations/signatures/outlook-windows
Install Scribe email signatures on Outlook for Windows by downloading the Scribe desktop app, made for users without a Microsoft 365 cloud license.
Follow the steps below to install your signatures on Outlook Windows.
**Each user has to install and configure integration.**
**Users see signatures when composing emails.**
**Cloud-based installation.** Emails don't go through Scribe servers.
## Installation guide
### Prerequisites
* A Scribe account
* At least one signature created in Scribe
* Windows with Outlook installed
This integration is only required for users who don't have a Microsoft 365 cloud license. Use our [Microsoft 365 integration](/en/integrations/signatures/microsoft-365-client-side) instead for complete automation.
Download the Scribe desktop app from the integrations page.
Log in to the Scribe app just as you do on Scribe's website.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Outlook Windows (Remote Monitoring)](/en/integrations/signatures/outlook-windows-rmm): push the Outlook Windows install through your RMM tool.
* [Outlook add-in not validating](/en/troubleshooting/outlook-add-in-installation-not-validating): fix an Outlook add-in that will not validate.
# Outlook Windows (Remote Monitoring)
Source: https://help.scribe-mail.com/en/integrations/signatures/outlook-windows-rmm
Deploy Scribe signatures across your whole team's Outlook for Windows at once by silently pushing the Scribe app and a registry key through your RMM tool.
Follow the steps below to install your signatures on Outlook Windows.
**Each user has to install and configure integration.**
**Users see signatures when composing emails.**
**Cloud-based installation.** Emails don't go through Scribe servers.
## Advanced Installation
This is an advanced user feature. IT support is required to set up this integration.
* This integration is only required for users who don't have a Microsoft 365 cloud license. Use our [Microsoft 365 integration](/en/integrations/signatures/microsoft-365-client-side) instead for complete automation.
* Once you install the Scribe app on your team's devices using your remote monitoring tools, team members are automatically logged in and their signatures are installed in Outlook. No action required from them.
Deploy a registry key using your remote monitoring management tool on each computer.
The key name is "DomainToken"
The key should be at `HKLM:\SOFTWARE\Policies\Scribe\Config`
The key value should be your domain token. You can copy your domain token from the integrations page.
Use the Scribe silent installer with any remote monitoring and management tool:
```text theme={null}
https://scribe-mail.com/desktop-app/windows-installer/latest
```
You just have to run the installer with the following command and the application will be installed silently:
```powershell theme={null}
Scribe-Setup-X.X.X.exe /S
```
The Scribe app auto-updates by default. To disable this, deploy a registry key on each computer.
The key name is "DisableAutoUpdate"
The key should be at `HKLM:\SOFTWARE\Policies\Scribe\Config`
The key value should be "1"
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Outlook Windows](/en/integrations/signatures/outlook-windows): per-user manual install on Outlook for Windows.
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
# Outreach
Source: https://help.scribe-mail.com/en/integrations/signatures/outreach-client-side
Install Scribe email signatures across your team's Outreach in one click by connecting the integration as an Outreach admin, no teammate action needed.
**Centralized one-click installation.** No teammate action needed. Users see signatures when composing emails. Cloud-based installation: emails don't go through Scribe servers.
**Supported platforms:** Web
## Installation guide
You must be an **Admin in Outreach** to install this integration.
Click **Connect Outreach** in Scribe to start the integration.
If you are already logged in, this step will be skipped.
Once you authorize, the integration connects automatically.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Salesforce](/en/integrations/signatures/salesforce-client-side): install Scribe signatures in Salesforce.
* [SalesLoft](/en/integrations/signatures/salesloft-client-side): install Scribe signatures in Salesloft.
* [Outreach Smart Fields](/en/integrations/smart-fields/outreach-smart-fields): sync Outreach data into signature Smart Fields.
# Salesforce
Source: https://help.scribe-mail.com/en/integrations/signatures/salesforce-client-side
Install Scribe email signatures across your team's Salesforce in one click by connecting the integration as a Salesforce admin, no teammate action needed.
**Centralized one-click installation.** No teammate action needed. Users see signatures when composing emails. Cloud-based installation: emails don't go through Scribe servers.
**Supported platforms:** Web
## Installation guide
You must be an **Admin in Salesforce** to install this integration.
Click **Connect Salesforce** in Scribe to start the integration.
If you are already logged in, this step will be skipped.
Once you authorize, the integration connects automatically.
To display your signature correctly in Salesforce, you need to add trusted domains in your Salesforce account settings.
In Salesforce settings, go to **Security > Trusted URLs,** then add the following URLs by clicking "New Trusted URL" button. You only need to select 'img-src' in CSP Directives.
* \*.sendassets.io
* \*.sigassets.com
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Outreach](/en/integrations/signatures/outreach-client-side): install Scribe signatures in Outreach.
* [SalesLoft](/en/integrations/signatures/salesloft-client-side): install Scribe signatures in Salesloft.
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
# SalesLoft
Source: https://help.scribe-mail.com/en/integrations/signatures/salesloft-client-side
Set up Scribe email signatures in Salesloft: connect the integration as an admin, then each teammate inserts their own signature from Salesloft settings.
**Each teammate inserts their own signature.** After you connect the integration, every teammate adds their signature from their Salesloft settings. Users see signatures when composing emails. Cloud-based installation: emails don't go through Scribe servers.
**Supported platforms:** Web
## Installation guide
* You must be an **Admin in Salesloft** to install the Salesloft integration.
* Each teammate has to insert their signature in the Salesloft settings.
Click **Connect SalesLoft** in Scribe to start the integration.
If you are already logged in, this step will be skipped.
Once you authorize, the integration connects automatically.
Go to the [Salesloft sign-in page](https://accounts.salesloft.com/sign_in) and sign in with your email and password.
Navigate to your SalesLoft account, click on your name, and select "Settings".
In the Email Signature section, open the Scribe Modal.
Choose the email you want and click "Insert signature". Note that each of your teammates would have to go to their SalesLoft settings to click on "Insert signature".
[Send your teammates an email](/en/install-signatures) with instructions on how to add their signature to their Salesloft account.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Outreach](/en/integrations/signatures/outreach-client-side): install Scribe signatures in Outreach.
* [Salesforce](/en/integrations/signatures/salesforce-client-side): install Scribe signatures in Salesforce.
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
# Smartlead
Source: https://help.scribe-mail.com/en/integrations/signatures/smartlead-client-side
Install Scribe email signatures across your team's Smartlead by connecting the integration with a Smartlead Admin API key, no teammate action needed.
**Centralized installation with your Smartlead API key.** No teammate action needed. Scribe keeps each teammate's Smartlead email-account signature in sync. Cloud-based installation: emails don't go through Scribe servers.
**Supported platforms:** Web
## How it works
Scribe matches each of your teammates to their Smartlead email account by email address, then keeps that account's signature in sync. Make sure the email addresses in Smartlead match the ones in Scribe.
Smartlead installs one signature per email address. If a teammate is assigned more than one signature, only the highest priority signature is installed. See [Signature priority](/en/signature-priority).
## Installation guide
You must be an **Admin in Smartlead** to create the API key, and an admin or owner in Scribe to set up the integration.
In Smartlead, click **Settings** in the top-right corner.
In the left menu, click **API Keys Management**.
Click **Create Admin Key**.
Enter a name for your API key, then click **Create**.
In the list, reveal the key you just created and copy the API key. Paste it into the field in Scribe, then click **Connect Smartlead**.
Scribe matches each teammate to their Smartlead email account by email address, then keeps that account's signature in sync. Make sure the email addresses in Smartlead match the ones in Scribe.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout.
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Outreach](/en/integrations/signatures/outreach-client-side): install Scribe signatures in Outreach.
* [SalesLoft](/en/integrations/signatures/salesloft-client-side): install Scribe signatures in Salesloft.
* [Signature installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
# Zoho Mail
Source: https://help.scribe-mail.com/en/integrations/signatures/zoho-mail
Install Scribe email signatures across your team's Zoho Mail in one click as a Zoho Mail admin, with no teammate action needed. Free on every plan.
**Centralized one-click installation.** No teammate action needed. Users see signatures when composing emails. Cloud-based installation: emails don't go through Scribe servers.
**Supported platforms:** Zoho Mail on the web
## How it works
Scribe writes each teammate's signature into Zoho Mail as a signature added by an administrator. Zoho Mail then inserts it by itself:
* in new emails, replies and forwards, above the quoted text;
* on each address it is installed for: the teammate's main address and, if you [import aliases](/en/integrations/teammates/zoho-mail-teammates), each alias with its own signature.
Your teammates can't edit the signature: Zoho Mail shows it as created by their administrator. When you publish a change in Scribe, or a teammate's details change, Scribe updates the same signature in Zoho Mail.
When a teammate is assigned more than one signature, Scribe installs each of them in Zoho Mail. Zoho Mail adds one signature per address to new emails: your highest priority signature (see [Signature priority](/en/signature-priority)). The others are added to the teammate's Zoho Mail signatures without being assigned to the address.
Zoho Mail adds the signature only in Zoho Mail. Emails sent from another app connected to Zoho Mail over IMAP or SMTP, such as Apple Mail or Outlook, don't carry it. For those apps, use a [manual installation](/en/integrations-overview#manual).
Zoho Mail signatures are free on every plan.
## Installation guide
### Prerequisites
* A Scribe account with admin access
* A Zoho Mail organization, with a **Super Admin** or **Admin** account
You must be a **Super Admin or Admin in Zoho Mail** to install this integration.
In Scribe, go to Integrations, open **Zoho Mail** under Signatures, and click **Connect Zoho Mail**.
If you are already signed in to Zoho, this step is skipped.
Zoho has no permission for signatures alone, so it asks you to let Scribe manage your organization's user accounts. Scribe only adds, updates and removes your teammates' signatures. You can find the scopes we use from the Zoho Mail API [here](/en/security/scopes-used-from-zoho-mail).
Check **I allow Scribe to access the above data from my Zoho account**, then click **Accept**. The integration connects automatically.
From your signatures list, [install all signatures at once for your teammates](/en/install-signatures) or install them one by one for a progressive rollout. Zoho Mail installs each signature at once: there is no waiting time.
Scribe supports Zoho accounts in every Zoho data center except China (zoho.com.cn). One Zoho Mail organization can be connected to one Scribe workspace.
## Troubleshooting
When an installation fails, the teammate's status in Scribe says why. Each reason has its own page:
* [Signature too long for Zoho Mail](/en/troubleshooting/zoho-mail-signature-too-long): Zoho Mail refused the signature because of its size.
* [Zoho Mail access lost](/en/troubleshooting/zoho-mail-access-lost): Scribe can no longer write signatures in your Zoho Mail organization.
* [Zoho Mail signature not installed](/en/troubleshooting/zoho-mail-signature-not-installed): the teammate's address has no active mailbox in your Zoho Mail organization.
If the connection fails, Scribe shows one of these messages:
| Message | What to do |
| - | - |
| You need to be an admin of your Zoho Mail organization to activate this integration. | Sign in to Zoho with a **Super Admin** or **Admin** account, or invite an admin to your Scribe workspace to connect it. |
| This Zoho Mail organization is already linked to another Scribe workspace. | Disconnect Zoho Mail from the other workspace first, or connect from that workspace. |
| Scribe does not support the Zoho data center of your account. | Your Zoho account is hosted in China, which Scribe does not support. |
| There is an issue with your credentials. Please try again. | Start again from **Connect Zoho Mail** and accept all the scopes. |
| Zoho Mail is not responding. Please try again in a few minutes. | Zoho did not answer. Wait a few minutes and try again. |
## Related articles
* [Integrations overview](/en/integrations-overview): all the ways to deploy Scribe signatures, cloud or server side.
* [Zoho Mail teammates](/en/integrations/teammates/zoho-mail-teammates): sync your Zoho Mail users and groups with Scribe.
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors): what each installation status means and how to fix errors.
# Preview signatures
Source: https://help.scribe-mail.com/en/preview-signatures
See exactly how each teammate's signature will look before installing, across primary, reply, and internal variants, in light and dark mode.
Click **Preview Signatures** from the top of any [signature detail page](/en/signature-detail-page) to open the preview modal.
## What the preview shows
The preview displays every assigned teammate's signature side by side, with their actual [Smart Field data](/en/smart-fields) filled in. This lets you verify that names, job titles, phone numbers, and other fields are displaying correctly before deployment.
Each signature card shows the full rendered design exactly as it will appear in the teammate's emails.
## Filter by variant
At the top of the modal, three tabs let you switch between signature contexts:
* **Primary**: The main signature used for new outgoing emails
* **Reply**: The [on-reply variant](/en/signature-variants) (if activated)
* **Internal**: The internal variant (if activated)
## Search and display options
Use the **search bar** to find a specific teammate's preview by name.
Toggle between **light mode** (sun icon) and **dark mode** (moon icon) to see how the signature renders on both light and dark email backgrounds. This is useful for checking contrast and readability across different email client themes.
Preview is a great way to catch issues before installing. Look for teammates whose signature is missing lines it should have (incomplete [Smart Field data](/en/smart-fields#what-happens-when-a-smart-field-is-empty)), broken layouts on dark backgrounds, or inconsistent formatting across teammates.
## Related articles
* [Signatures overview](/en/signatures-overview): how preview fits into the signature workflow.
* [Install signatures](/en/install-signatures): deploy signatures once the preview looks right.
* [Signature status](/en/signature-status): track design, teammate, and installation state per signature.
# Email signature ROI calculator
Source: https://help.scribe-mail.com/en/roi-calculator
Use Scribe's two ROI calculators to estimate the leads your email signatures can generate and the time your team saves by automating signature installs.
## Turn email signatures into lead generation and save your team time.
Scribe comes with two ROI calculators to help you measure the impact on your business.
## Lead generation calculator
Find out how many new leads your email signatures can generate versus the [cost of Scribe](/en/pricing).
**Answer these questions:**
1. How many people are on your team?
2. On average, how many outreach emails does each teammate send daily?
3. What's your average customer value?
The calculator uses a **12% average click-through rate** on Scribe [marketing banners](/en/marketing-overview) (6x higher than email marketing standards, measured on 50,000+ emails) and a 2% baseline paid conversion rate to estimate your potential monthly revenue.
**Example with a 50-person team sending 20 emails/day:**
* 21,000 monthly outreach emails (50 × 20 × 21 working days)
* 2,520 new leads per month (21,000 × 12%)
* 50.4 paying customers (2,520 leads × 2% conversion rate)
* Potential monthly revenue: 5,040 USD (50.4 customers × 100 USD AOV)
## Time saving calculator
Find out how much time and money your team wastes on [manual email signature management](/en/install-signatures).
**Answer these questions:**
1. How many people are on your team?
2. How often do you update signatures?
3. What's the average hourly rate for your team?
The industry average is 45 minutes per update, including design, approvals, manual installation, and follow-ups.
**Example with a 100-person team updating bi-weekly:**
* 150 hours per month (100 × 2 × 0.75 hours)
* Monthly cost: 7,500 USD (150 hours × 50 USD/hour)
* Yearly cost: 90,000 USD (75 USD per user per year)
* Scribe yearly cost: 2,544 USD (25.44 USD per user per year)
## Related articles
* [Why email signatures](/en/why-email-signatures): the case for signatures as an untapped marketing channel.
* [Plans](/en/plans): compare the Free, Business, and Enterprise tiers.
* [Analytics overview](/en/analytics-overview): measure the views, clicks, and click-through rate behind these numbers.
# Sign in and sign up
Source: https://help.scribe-mail.com/en/sign-in-and-sign-up
Create a Scribe account or sign in with Google, Microsoft 365, or your work email. Learn how to verify your email, reset your password, and stay signed in.
This guide covers everything you need to access Scribe: creating a new account, signing in to an existing one, verifying your email address, and resetting your password if you forget it.
## Create your Scribe account
You can create a Scribe account in three ways, and all of them use your work email. Your work email is the address you use at your company, for example [you@yourcompany.com](mailto:you@yourcompany.com).
Scribe is built for teams, so signing up requires a work email. Personal or free email addresses such as Gmail, Yahoo, or iCloud are not accepted. If you try to use one, you will see the message "Business address is required."
To get started, open the sign up page and choose how you want to register:
* **Continue with Google**: register using your Google work account.
* **Continue with Microsoft 365**: register using your Microsoft 365 work account.
* **Continue with email**: register with your work email and a password.
If you choose email, follow these steps:
Type your work email and choose a password. Your password must contain at least 10 characters.
Review the Scribe Terms of Service, Privacy Policy, and Cookie Policy, then complete your registration.
Scribe sends a verification code to your inbox so you can confirm your address. See [Verify your email](#verify-your-email) below.
When you sign up, Scribe automatically creates a workspace for you and starts your free trial. You become the owner of that workspace.
## Sign in to Scribe
If you already have an account, open the login page and sign in with the same method you used when you registered:
* **Continue with Google**
* **Continue with Microsoft 365**
* **Log in with email**, using your work email and password
Scribe marks your most recent method with a **Last used** label, so you can quickly choose the one you used before.
Always sign in with the same method you used to sign up. If you registered with Google or Microsoft 365, use that button rather than email and password.
## Verify your email
The first time you sign in, Scribe may ask you to confirm your email address. We send a six digit code to your inbox.
Look for the email titled "Verify your email". If you cannot find it, check your spam folder.
Type the code on the verification screen. It submits automatically once all six digits are entered.
The verification code expires within 10 minutes. If it expires, sign in again to receive a new code.
If the code is wrong or out of date, you will see "The confirmation code is invalid or has expired." Sign in again to get a fresh code.
## Reset your password
If you forget your password, you can set a new one from the login page.
On the login page, choose **Forgot your password?** and enter your work email.
Scribe sends an email titled "Reset password" with a link to create a new password. Check your spam folder if it does not arrive.
Follow the link and enter a new password. It must contain at least 10 characters. Once you save it, you are signed in automatically.
Scribe does not have a separate change password screen. To change your password at any time, use the **Forgot your password?** link on the login page and follow the reset email.
For your security, Scribe shows the same confirmation whether or not the email matches an account, so no one can use the reset form to discover which addresses are registered.
Occasionally Scribe may ask you to set a stronger password when you sign in, if your current password no longer meets the latest requirements. Follow the on screen prompt to create a new one.
## Stay signed in and sign out
Scribe keeps you signed in on your device, so you do not need to log in every time you come back. You can sign out whenever you want, which ends your session on that device.
If you belong to more than one workspace, you can switch between them inside Scribe. Switching reloads the app so it shows the workspace you selected. To learn more about working across workspaces, see [Workspaces](/en/workspaces).
## Troubleshooting sign in
Here are the most common messages you might see and what to do about them:
* **"Business address is required"**: you tried to sign up with a personal or free email. Use your work email instead.
* **"Email already exists" or "This email is already in use"**: an account already uses this email. Open the login page and sign in instead of registering.
* **"Domain has already been taken"**: your email domain already belongs to a Scribe workspace. Ask your administrator to invite you, or contact support for help.
* **"Invalid email or password"**: check your email and password carefully. If you registered with Google or Microsoft 365, use that button rather than a password. If you forgot your password, reset it from the login page.
* **"The confirmation code is invalid or has expired"**: your verification code is no longer valid. Sign in again to receive a new one.
# Signature analytics
Source: https://help.scribe-mail.com/en/signature-analytics
Track views, clicks, and click-through rates for each Scribe signature, broken down by element, teammate, and country to measure signature performance.
From the signature detail page, click the **Analytics** tab to see performance data for this specific signature. For workspace-wide analytics across all signatures, teammates, and campaigns, see [Analytics Overview](/en/analytics-overview).
Everything on this page is measured by Scribe. If you also [personalize your links](/en/editor/personalize-links) with UTM parameters, that data goes to your own analytics tool and is reported there. It is a separate dataset, so the numbers won't match what you see here one to one.
## Overview chart
The top section shows three key metrics over time:
* **Total Views**: How many times the signature was seen by email recipients
* **Total Clicks**: How many times recipients clicked on an element in the signature
* **Click-through Rate**: The percentage of views that resulted in a click
Click on any metric to highlight it in the chart. Use the date picker in the top-right to adjust the time range, and toggle between **Day**, **Week**, and **Month** views.
## Top 5 elements
A table showing the five most-clicked elements in your signature. Each row shows the element's preview, type (e.g., Social, Banner, Link), link, views, clicks, CTR, status, and lifetime.
## Top 5 teammates
Shows which teammates generate the most engagement. Each row displays the teammate's name, email, total views, clicks, and CTR.
This helps you identify your most active email senders and understand which teammates drive the most signature engagement.
## Top 5 countries
Shows where your email recipients are located based on signature views. Columns include country, views, clicks, and CTR.
Analytics data requires tracking to be enabled. If you see "No data available yet", make sure tracking is turned on in your workspace settings.
To go beyond views and clicks and record the conversions a signature drives on your website, see [Conversion tracking](/en/conversion-tracking).
# Signature detail page
Source: https://help.scribe-mail.com/en/signature-detail-page
Everything you see when you open a signature: design preview, setup checklist, installation stats, campaigns, and analytics at a glance.
Click on any signature card from the Signatures page to open its detail page. This is your command center for managing a single signature, from design to deployment.
The detail page is organized into five tabs: **Overview**, **[Teammates](/en/assign-teammates-to-a-signature)**, **[Variants](/en/signature-variants)**, **[Analytics](/en/signature-analytics)**, and **[Settings](/en/signature-settings)**. This article covers the Overview tab.
At the top of the page, three actions are always available:
* **[Preview Signatures](/en/preview-signatures)**: See how the signature looks for each teammate
* **Edit Signature**: Open the signature editor
* **Install X signatures**: Deploy the signature to assigned teammates
## Signature preview
The left side of the Overview tab shows a live preview of your signature design. Hover over the preview to reveal the **Edit signature** button, which takes you directly to the editor.
## Setup checklist
The right side shows a step-by-step **Setup** panel that tracks your progress. A counter in the top-right corner (e.g., "1/3") shows how many steps are complete.
The steps differ depending on whether you use an automated integration or a manual setup.
**With an integration (Google Workspace, Microsoft 365 or Zoho Mail):**
1. **Publish signature updates**: If you've made design changes that haven't been published yet, click **Publish Updates** to push them live. After the initial installation, published updates are automatically pushed to your teammates, with no reinstall needed.
2. **Assign teammates to your signature**: Select which teammates will use this signature. Shows an "Assigned" badge once teammates have been added.
3. **Connect an integration**: Link your Google Workspace, Microsoft 365 or Zoho Mail account to enable automatic installation. Click **Connect Integration** to set it up.
**Without an integration (manual setup):**
1. **Publish signature updates**: Same as above.
2. **Assign teammates to your signature**: Same as above.
3. **Invite teammates to install their signatures**: Click **Invite teammates** to send an email inviting your teammates to join Scribe and install their signature themselves.
With an automated integration, the Setup panel shows **"No action needed from your teammates"**. Everything is handled by the admin. With a manual setup, teammates will need to take action by accepting the invitation and installing their signature.
## Installation
Below the setup panel, four cards summarize the installation status for this signature:
| Card | Meaning |
| - | - |
| **Installed** | Teammates with the signature successfully deployed (e.g., "0/1") |
| **Pending** | Installation request sent, waiting for Google or Microsoft to process it. Zoho Mail installs at once, so it never shows Pending |
| **Not installed** | Teammates who haven't received the signature yet |
| **Failed** | Installation encountered an error |
A second row of cards shows installation breakdown by device type: **Web**, **Desktop**, **Mobile**, and **Tablet**.
## Teammates
Two cards show teammate assignment at a glance:
* **Teammates Assigned**: How many teammates are assigned to this signature
* **Profile Completion**: The average completion percentage across all assigned teammates' Smart Field data
A low profile completion means some teammates are missing information (e.g., phone number, job title) that the signature design uses. Their signatures still render cleanly, because Scribe drops the blocks with no value and closes the layout around them (see [what happens when a Smart Field is empty](/en/smart-fields#what-happens-when-a-smart-field-is-empty)). But those teammates send a signature carrying less information than the design intends.
## Smart Fields used in this signature
A table lists every [Smart Field](/en/smart-fields) used in this signature's design, with three columns:
* **Name**: The Smart Field (e.g., First name, Job Position, Work phone number)
* **Integration**: Where the data comes from (e.g., Entra ID, Google Workspace, or Scribe)
* **Teammates Completion**: A progress bar and count (e.g., "15/19" at 79%) showing how many assigned teammates have this field filled
This helps you quickly identify which fields are causing incomplete signatures and take action, either by updating teammate profiles or adjusting the signature design.
## Marketing Campaigns
Three cards show the campaign status for this signature:
* **Running**: Currently active campaigns
* **Scheduled**: Campaigns set to start in the future
* **Archived**: Past campaigns
Campaigns are managed from the dedicated Campaigns section. This is just a summary view.
## Analytics
Three cards give you a quick performance snapshot:
* **Total Views**: How many times the signature has been seen
* **Total Clicks**: How many times recipients clicked on elements in the signature
* **Click-through Rate**: The percentage of views that resulted in a click
For detailed analytics, switch to the **Analytics** tab.
## Related articles
* [Signatures overview](/en/signatures-overview): how the signature library and detail page fit together.
* [Create and manage signatures](/en/create-and-manage-signatures): create, duplicate, and organize signatures.
* [Install signatures](/en/install-signatures): deploy the signature to assigned teammates.
# Signature installation statuses and errors
Source: https://help.scribe-mail.com/en/signature-installation-statuses-and-errors
Understand Scribe signature installation statuses like Installed, Pending, and Failed, and fix common errors across Gmail, Microsoft 365, Zoho Mail, and Outlook.
When you install signatures, each teammate shows an installation status so you can see whether their signature is live. This guide explains what each status means and how to fix the most common installation problems. To set up installation in the first place, see [Install signatures](/en/install-signatures).
## Installation statuses
Each teammate's signature shows one of these statuses:
* **Installed**: the signature is installed and active.
* **Pending**: the installation is in progress or waiting on the email provider. For Gmail this can take up to 72 hours. For Microsoft 365, the signature installs the first time the person composes an email, so it stays pending until then. Zoho Mail installs at once and never shows Pending.
* **Not activated**: installation has not been turned on for this signature.
* **Not installed**: no installation has happened yet, or the provider skipped it.
* **Failed**: the installation was attempted but did not succeed. See the reasons below.
* **Not supported**: the integration cannot install more than one signature for this email, so this signature was not installed. See [Multiple signatures per email](#multiple-signatures-per-email).
* **Access lost**: Scribe has lost its connection to the integration. Reconnect the integration to restore installation. Scribe also emails workspace admins when this happens.
If a teammate uses more than one device or email address, their overall status can show as partially installed when some are installed and others are not.
## Why an installation fails
When a signature shows **Failed**, open the status to see the reason. The most common ones are below.
### User not found
You will see a message that the user was not found on the provider. The email address does not match a user or mailbox in the connected provider. Check that the teammate's email exists in that provider and is spelled correctly.
### Forbidden or unauthorized access
You will see a message that the provider has forbidden access to this teammate's signature. Scribe is not authorized to update this person's signature in the provider. Reconnect the integration, make sure Scribe has the permissions it needs, and try again.
### Signature is too long
You will see a message that the signature is over Gmail's 10,000 character limit. Gmail limits signatures to 10,000 characters and this signature is larger. Open the signature in the editor, remove some elements to make it shorter, then reinstall.
For Zoho Mail, you will see a message that the signature is longer than Zoho Mail accepts. Zoho Mail doesn't publish its limit: see [Signature too long for Zoho Mail](/en/troubleshooting/zoho-mail-signature-too-long).
### Multiple signatures not supported
You will see a message that the provider does not handle multiple signature installations. This is expected rather than an error: that integration can only install one signature per email, so only your highest priority signature is installed.
## Multiple signatures per email
Most integrations install one signature per email address. If a teammate is assigned more than one signature, only the highest priority signature is installed, and the others show **Not supported**. You can control which one wins with [Signature priority](/en/signature-priority). Front and Zoho Mail can install more than one signature per email. In Zoho Mail, every signature is installed, and your highest priority signature is the one Zoho Mail adds to new emails.
## Provider notes
* **Gmail**: installs can take up to 72 hours. If a Gmail signature stays **Not installed**, check that Gmail is enabled for that user in Google Workspace and that the account is active.
* **Microsoft 365 and Outlook**: the signature installs through Outlook the first time the person composes an email, so it shows **Pending** until then.
* **Apple Mail and Outlook on the desktop**: these install through the Scribe desktop app on the person's computer.
* **Zoho Mail**: signatures install at once. An address with no active mailbox in your Zoho Mail organization is skipped and stays **Not installed**: see [Zoho Mail signature not installed](/en/troubleshooting/zoho-mail-signature-not-installed). If the integration shows **Access lost**, see [Zoho Mail access lost](/en/troubleshooting/zoho-mail-access-lost).
## Fix a failed installation
Once you have resolved the cause, reinstall the signature. Scribe reuses the same installation record, so when an install succeeds the status changes from **Failed** to **Installed** automatically. For Front, Scribe links you to specific troubleshooting steps directly from the error message.
# Signature priority
Source: https://help.scribe-mail.com/en/signature-priority
Set the order in which signatures appear in Outlook. Higher priority signatures are shown first. Only applies to Microsoft 365 users.
Signature priority lets you control the order in which signatures appear in Outlook. The signature with the highest priority (position 1) is set as the default signature for your teammates.
Signature priority only applies to **[Microsoft 365 / Outlook](/en/integrations/signatures/microsoft-365-client-side)** users. [Gmail users](/en/integrations/signatures/google-workspace-client-side) are not affected by this setting. In Gmail, each teammate is assigned a single signature.
## How it works
When a teammate has access to multiple signatures in Outlook, the priority order determines which signature appears first. Higher positions appear first in Outlook's signature list.
This is useful when a teammate is assigned to more than one signature, for example a primary branded signature and a secondary minimal signature for [internal emails](/en/signature-variants).
## Set signature priority
Click the **reorder icon** in the top-right area of the Signatures page to open the Signature Priority modal.
From there:
1. Drag and drop signatures to reorder them
2. The position number on the right updates automatically
3. Click **Update Priority** to save
If your team uses Outlook and you only have one signature per teammate, you don't need to worry about priority. It only matters when teammates are assigned to multiple signatures.
## Related articles
* [Signatures overview](/en/signatures-overview): how priority fits into managing multiple signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): control which teammates use each signature.
* [Install signatures](/en/install-signatures): deploy signatures to Outlook and Gmail.
# Signature settings
Source: https://help.scribe-mail.com/en/signature-settings
Manage a single signature from its Settings tab: rename it for internal use, turn marketing campaign banners on or off, or permanently delete it.
From the [signature detail page](/en/signature-detail-page), click the **Settings** tab to manage general settings for this signature.
## General
**Signature Name**: Update the name of your signature (2 to 20 characters). This is for internal identification only, so teammates and email recipients never see it.
**Marketing Campaigns**: Toggle whether [marketing campaign banners](/en/marketing-overview) are enabled for this signature. Set to **Active** to allow campaigns to display in this signature, or **Inactive** to disable them. Click **Save Changes** to apply.
## Danger Zone
**Delete Signature**: Permanently deletes this signature. This action is irreversible. All related signatures assigned to your teammates will be removed. Your teammates themselves will remain available in Scribe to be assigned new signatures.
Deleting a signature does not automatically uninstall it from your teammates' email clients. If the signature was already installed, you should [uninstall it first](/en/install-signatures) before deleting to avoid orphaned signatures in your teammates' email clients.
## Related articles
* [Signatures overview](/en/signatures-overview): how settings fit into managing a signature.
* [Create and manage signatures](/en/create-and-manage-signatures): rename, duplicate, and delete signatures from the library.
* [Signature variants](/en/signature-variants): manage campaign banners separately for replies and internal emails.
# Signature status
Source: https://help.scribe-mail.com/en/signature-status
Understand the status indicators on each Scribe signature card, covering design progress, teammate assignment, and installation state at a glance.
Every signature card on the Signatures page displays three status indicators that tell you exactly where things stand, without having to open the signature.
## How to read the status
Hover over the bottom of any signature card to see the full status breakdown:
* **Design**: Whether the signature design has been published or is still in draft
* **Teammates**: How many [teammates are assigned](/en/assign-teammates-to-a-signature) to this signature
* **Installation**: How many teammates have the signature successfully [installed](/en/install-signatures)
## Status colors
Each indicator uses one of two colors:
| Color | Meaning |
| - | - |
| 🟢 **Green** | Complete: design is published, teammates are assigned, or signatures are fully installed |
| 🟡 **Yellow** | Needs attention: draft design, no teammates assigned, or installation incomplete |
## Design status
* **Published** (green): The signature design is finalized and ready to install. Any changes you publish are automatically pushed to your teammates.
* **Draft** (yellow): The signature has unpublished design changes. Teammates still see the last published version until you publish the updates.
## Teammates status
* **X assigned** (green): One or more teammates are assigned to this signature
* **No teammate assigned** (yellow): No teammates have been assigned yet
## Installation status
* **X/X installed** (green): The signature has been installed for all assigned teammates
* **X/X installed** (yellow): Not all assigned teammates have the signature installed yet (e.g., "0/1 installed")
## Stats bar
The three counters at the top of the Signatures page summarize the same information across your entire workspace:
* **Created**: Total number of signatures
* **Assigned teammates**: How many teammates have a signature assigned out of your total team size (e.g., "18/19")
* **Installed signatures**: How many signatures are installed out of the total that should be (e.g., "0/18")
Use the stats bar as a quick health check. If "Assigned teammates" doesn't match your team size, you have teammates without a signature. If "Installed signatures" is lower than expected, some signatures need to be deployed.
## Related articles
* [Signatures overview](/en/signatures-overview): where signature status fits into the workflow.
* [Filter and search signatures](/en/filter-and-search-signatures): use these statuses to filter your workspace.
* [Signature installation statuses and errors](/en/signature-installation-statuses-and-errors): a deeper look at each installation state.
# Signature variants
Source: https://help.scribe-mail.com/en/signature-variants
Use on-reply and internal signature variants in Scribe to show different designs by context. Available with Microsoft 365, Outlook, and Google Workspace.
Signature variants work with [Microsoft 365 and Outlook](/en/integrations/signatures/microsoft-365-client-side), and with [server side installation](/en/integrations/signatures/google-workspace-server-side) for both Google Workspace and Microsoft 365. They are not applied by the client side Gmail installation, which writes a single signature into your Gmail settings with no variants per email context.
Signature variants let you use different signature designs depending on the email context. Instead of showing the same full signature every time, you can set up lighter versions for replies and internal emails.
From the [signature detail page](/en/signature-detail-page), click the **Variants** tab.
## How variants work
Every signature has a **Primary** signature: the main design used for new outgoing emails. Variants let you define alternative designs for two other contexts:
**On-Reply signature**: Used when a teammate replies to or forwards an email. This is typically a shorter version of the primary signature, for example just the name, title, and phone number without the full banner or social icons.
**Internal signature**: Used when a teammate emails someone within your organization. This might be a minimal design since recipients already know the sender, or it could use a different visual style for internal communications.
## Activate a variant
Each variant has an activation checkbox below its preview:
* **Activate On-Reply signature**: Yes / No
* **Activate Internal signature**: Yes / No
Set to **Yes** to enable the variant. When set to **No**, the primary signature is used for that context instead.
Each variant also has its own **Activate Marketing Campaign** toggle, letting you control whether campaign banners appear in replies and internal emails independently from the primary signature.
## Edit a variant
Click the **⋯** menu on any variant card to access two options:
* **Edit Variant**: Opens the variant in the [signature editor](/en/editor/editor-overview) so you can customize its design independently from the primary signature
* **Reset to Primary Signature**: Reverts the variant back to match the primary signature design
A common setup is to keep the primary signature with the full design and campaign banner, use a shorter on-reply variant without the banner, and use a minimal internal variant with just the name and title. This keeps external emails on-brand while keeping internal threads clean.
## Related articles
* [Signatures overview](/en/signatures-overview): how variants fit into the signature workflow.
* [Preview signatures](/en/preview-signatures): check the primary, reply, and internal variants before installing.
* [Signature priority](/en/signature-priority): order multiple signatures for Outlook teammates.
# Signatures overview
Source: https://help.scribe-mail.com/en/signatures-overview
Your central hub for creating, organizing, and managing all your email signatures. See status, assign teammates, and install with one click.
The Signatures page is where you create, organize, and manage all your email signatures. From here you can see the status of every signature at a glance, organize them into folders, and install them across your team with one click.
## Stats bar
At the top of the page, three counters give you a real-time overview:
* **Created**: The total number of signatures in your workspace
* **Assigned teammates**: How many teammates have been assigned a signature out of your total team size
* **Installed signatures**: How many signatures have been successfully installed out of the total assigned
## Folders
Folders let you organize your signatures by department, brand, country, or any other grouping that makes sense for your team. For example, you might create folders like "Marketing France", "UK Operations", or "Sales DACH".
Click on a folder to see the signatures inside it, with a breadcrumb navigation to go back to all signatures.
Each folder card shows the folder name and how many signatures it contains.
## Signature cards
Each signature appears as a card showing:
* A preview of the signature design
* The signature name
* A color-coded status dot (Design, Teammates, Installation)
* The number of teammates assigned and signatures installed
Hover over a signature card to see a detailed status breakdown, including the design status (Draft or Published), how many teammates are assigned, and the installation state.
## Quick actions
From the top-right corner:
* **+ Create New**: Create a new signature or a new folder
* **Install Signatures**: Open the installation modal to deploy signatures to your team
From the **⋯** menu on each signature card:
* **Edit**: Open the signature in the editor
* **Duplicate**: Create a copy of the signature
* **Delete**: Remove the signature
From the **⋯** menu on each folder card:
* **Edit**: Rename the folder
* **Delete**: Remove the folder (only available once the folder is empty)
You can also **drag and drop** signatures into folders to organize them quickly.
Create signatures, folders, and organize your workspace
Understand status indicators and what they mean
Deploy signatures to your team
# Smart Fields
Source: https://help.scribe-mail.com/en/smart-fields
Manage the smart fields that populate your Scribe signatures: choose data sources, track completion across teammates, and fill in missing information.
Smart Fields are the data fields that feed into your email signatures. Instead of manually entering each teammate's information, Smart Fields pull data automatically from your existing tools, like your directory or HRIS, so signatures stay accurate without the busywork. Each Smart Field maps to a piece of teammate information (First name, Job Position, Work phone number, etc.) and syncs its value from a connected data source. The Smart Fields page is where you manage these fields, track data completeness, and fill in any gaps before deploying signatures.
## Status bar
At the top of the page, three indicators give you a quick overview:
* **Data Source Connected**: How many data sources are currently connected and syncing data into your Smart Fields (e.g., 1 for Google Workspace).
* **Used in Signature**: How many of your Smart Fields are actively used in at least one signature template (e.g., 0/7 means none of your fields are inserted in a signature yet).
* **Information Completed**: The average data completion across all teammates and all Smart Fields, displayed as a percentage.
## The Smart Fields table
Each row represents one Smart Field and shows the following columns:
**Name**: The field label (e.g., Profile picture, First name, Job Position). These are the names that appear in the signature editor when you insert dynamic fields.
**Data source**: Where this field pulls its data from. Each field shows an icon and label for its source (e.g., Google Workspace, Microsoft Entra ID, Zoho Mail, BambooHR, or Scribe). Hover over the data source icon to see when it was last refreshed (e.g., "Refreshed a day ago").
**Information completion**: A progress bar and percentage showing how many of your teammates have this field filled in. Hover over the percentage to see the exact count (e.g., "2/9 teammates have Profile picture data").
**Used in signatures**: Whether this field is currently inserted in one or more signature templates. Shows a dash if not used in any signature.
**Actions**: Each row has action buttons and a contextual link that changes based on the field's data source and completion status:
* **Fill teammates data** or **Edit teammates data**: Opens a dropdown or modal to fill in or edit the data for this field across all teammates (see [Filling Smart Field data](#filling-smart-field-data) below).
* **Edit Smart Field** (pencil icon): Opens the Edit Smart Field modal to change the field's settings (see [Editing a Smart Field](#editing-a-smart-field) below).
* **Delete** (trash icon): Delete a custom Smart Field. Default Smart Fields (Profile picture, First name, Last name, Job Position) can't be deleted. Hovering the disabled trash icon shows "Default smart field can't be deleted.
## Refreshing data
Click **Refresh** in the top right to manually sync data from all connected sources. After refreshing, a notification appears below the button showing the source name and how recently it was synced (e.g., "Google Workspace, a few seconds").
Scribe also automatically syncs connected data sources once per day based on your time zone.
## Creating a Smart Field
Click **+ Create Smart Field** in the top right to add a new field. The creation modal has the following settings:
**Name** (required): The label for this field as it will appear in Scribe. Must be 25 characters or less.
**Kind** (required): The type of data this field holds:
* **Text**: Standard text values like phone numbers, titles, or departments
* **Image**: Image fields like a profile picture or company logo
* **Link**: URL fields like a personal website or calendar booking link
**Data Source** (required): Where this field pulls its data from. The dropdown is split into two categories:
* **Automated**: Sync data from a connected integration. The field stays in sync automatically with each refresh. Available integrations include Google Workspace, Microsoft Entra ID, Zoho Mail, and any HRIS, business phone system, calendar, or sales tool you've connected on the [Integrations](/en/integrations-overview) page (see [Supported integrations](#supported-integrations) below).
* **Manual**: Store data directly in Scribe. You'll need to fill this data yourself, via CSV, or by inviting teammates to enter it.
**Source field** (required): The specific field to map this Smart Field to within your selected data source. For example, if your data source is Google Workspace, you can choose from fields like First name, Surname, Job position, Mobile phone, Home phone, or Work phone. If your data source is Scribe, the available source fields correspond to the manual fields stored in Scribe. The options in this dropdown depend on which data source you've selected.
**Required** (required): Whether this field counts toward profile completion. If set to **Yes**, teammates missing this field will show as incomplete. If set to **No**, the field is optional and won't affect the Information Completed percentage.
Use required fields strategically. Only mark fields as required if they're used in your signature templates. Otherwise, your completion percentage will be misleadingly low and make it harder to spot teammates who are actually missing critical data.
## Editing a Smart Field
Click the pencil icon on any Smart Field row to open the Edit Smart Field modal. The modal lets you change:
**Name**: The field label in Scribe. For default Smart Fields (Profile picture, First name, Last name, Job Position, Work phone number, Mobile phone number), the name is locked and can't be changed. Hovering the lock icon shows "Default Smartfield can't be edited."
**Data Source**: Switch between automated integrations and manual (Scribe) storage, using the same Automated / Manual dropdown as the creation modal.
**Source field**: Select which specific field to map to within your chosen data source. For automated sources, this maps to fields from your integration (e.g., Surname, Job position, Mobile phone). For Scribe, it maps to the corresponding manual field.
**Required**: Toggle whether this field counts toward profile completion.
You can't change the **Kind** (Text, Image, or Link) of a Smart Field after it's been created. If you need a different kind, create a new Smart Field and delete the old one.
## Filling Smart Field data
How you fill a Smart Field depends on its data source. Click the action link in the Actions column (e.g., "Fill teammates data") to see the available options.
### Automated fields (Google Workspace, Microsoft Entra ID, Zoho Mail, or HRIS)
For fields connected to an integration, the dropdown shows:
* **Update data on \[integration name]**: Redirects you to your integration's admin console where you can update the source data directly. Once updated, the changes will appear in Scribe after the next sync or manual refresh.
* **+ Connect a new data source**: Redirects to the Integrations page to connect an additional data source.
Since automated fields are synced from your integration, they can't be edited directly in Scribe. You update the data at the source.
### Manual fields (Scribe)
For fields stored in Scribe, the dropdown offers three ways to fill data:
* **Fill data manually**: Opens the **Fill teammates data** modal, where you can edit the field value for each teammate in bulk. The modal shows a searchable list with each teammate's name, status (Filled or Missing), and an input field to enter the data. A progress indicator at the top shows overall completion. Click **Save** when done.
* **Fill data via CSV**: Import field values for multiple teammates at once using a CSV file.
* **Invite teammates to fill data**: Opens the **Invite Teammates** modal, where you can select teammates and send them an email invitation. Invited teammates can access their own profile to fill in their information and install their signature. They won't have access to the rest of your Scribe workspace.
Inviting teammates is especially useful for fields your directory doesn't cover, like mobile phone numbers or personal social media links. Instead of collecting this data yourself, let teammates enter it directly.
## What happens when a Smart Field is empty
If a teammate has no value for a Smart Field, the block connected to that field is not rendered in their signature. Scribe removes it and closes the layout around it, so the signature keeps its spacing and proportions instead of showing an empty line or a gap where the data should be.
This happens automatically, per teammate, so a single template can serve everyone. A teammate with no mobile phone number gets a signature without that line, while colleagues who have one keep theirs. You don't need a separate template or a manual edit for teammates with partial data.
Placeholder values appear only in the editor canvas and in previews, where they let you check the layout. In the signature your teammate actually sends, an empty Smart Field is dropped rather than filled with a placeholder or a field name.
Layout adaptation keeps signatures clean, but it doesn't fill the gap in your data: a teammate missing a job title still sends a signature without one. Use the **Information completion** column to spot which fields are incomplete, then [fill the data](#filling-smart-field-data) so everyone's signature carries the full set of information.
## Default vs. custom Smart Fields
Scribe comes with a set of default Smart Fields: **Profile picture**, **First name**, **Last name**, **Job Position**, **Work phone number**, and **Mobile phone number**. These can't be deleted or renamed, but you can change their data source, source field mapping, and required status.
Custom Smart Fields you create (like a department name, booking link, or company logo) can be fully edited and deleted.
## Supported integrations
Scribe connects to a wide range of tools to automatically sync teammate data into your Smart Fields. You can connect integrations from the [Integrations](/en/integrations-overview) page. Available integrations are grouped into the following categories:
**HRIS**: BambooHR, Ceridian Dayforce, ChartHop, Deel, Gusto, Hibob, Lattice, Lucca, Okta, Payfit, Rippling, UKG, Workday, and Workleap Pingboard.
**Business Phone System**: Aircall, Cloudtalk, Dialpad, and Nextiva.
**Calendar**: Cal.com, Calendly, and Chili Piper.
**Sales execution**: Outreach.
Each integration syncs specific fields (like name, job title, phone number, or department) that you can map to your Smart Fields using the Source field selector. Once connected, data syncs automatically once per day, or you can trigger a manual refresh at any time.
# Add teammates manually
Source: https://help.scribe-mail.com/en/teammates/add-teammates-manually
Add teammates to Scribe one at a time without a directory sync: enter their name, job position, and email, ideal for small teams or people outside a directory.
Add teammates one at a time directly in Scribe. This is useful when you have a small team, need to add a few people outside your directory, or don't use Google Workspace, Microsoft Entra ID or Zoho Mail.
## How to add a teammate
1. Go to **Teammates** and click **+ Add Teammates** in the top-right corner.
2. Select **Add manually** under the Manual section.
3. Fill in the required fields:
* **First Name**
* **Last Name**
* **Job Position**
* **Email**
4. Click **Add Teammate**.
The teammate will appear in your teammates list immediately.
### Add multiple teammates in a row
Enable the **Add another teammate** toggle at the bottom of the modal before clicking **Add Teammate**. The form will stay open after each submission so you can add the next person without reopening the modal.
If you need to add more than a handful of teammates, consider [uploading a CSV](/en/teammates/upload-csv) or syncing from your [Google Workspace](/en/editor/google-workspace-directory) or [Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) directory instead.
## What happens next
Manually added teammates work the same as synced teammates. You can:
* [Assign signatures](/en/assign-teammates-to-a-signature) to them
* Edit their profile information at any time from the teammates list
* Add them to groups for easier signature management
If you later connect a directory integration (Google Workspace, Microsoft Entra ID or Zoho Mail), it will override your manually added teammates. Only use the manual option if you don't plan to sync from a directory, or if you need to add people who aren't in your directory.
# Connect Microsoft Entra ID
Source: https://help.scribe-mail.com/en/teammates/connect-microsoft-entra-id
Sync your company directory from Microsoft Entra ID to Scribe to automatically import teammates and keep their profile information up to date.
Sync your Microsoft Entra ID directory with Scribe to import teammates, organizational units, and groups. Once connected, Scribe automatically stays in sync with your directory. When teammates join, leave, or change roles, their signatures update accordingly.
## Prerequisites
* A **Global Admin** role in Microsoft Entra ID
* An active Microsoft 365 subscription
Only a Global Admin can authorize the connection between Scribe and Microsoft Entra ID. If you don't have this role, Scribe will prompt you to invite your Global Admin to complete this step.
## Step 1: Start the integration
Go to **Settings → Integrations** and click **Connect** on the Microsoft Entra ID card.
A modal will appear with an overview of the setup steps:
1. Connect Entra ID
2. Select account
3. Accept scopes
4. Select teammates
Click **Connect Entra ID** to begin.
## Step 2: Pick your Microsoft account
A Microsoft sign-in window will appear. Select the account associated with your organization's Microsoft 365 tenant.
Make sure you sign in with an account that has the **Global Admin** role. If you sign in with a non-admin account, the authorization will fail.
## Step 3: Accept permissions
Microsoft will display a **"Permissions requested"** consent screen listing the scopes Scribe needs to read your directory. These permissions allow Scribe to:
* Read your organizational structure (users, groups, departments)
* Deploy signatures to the right people automatically
* Keep signatures updated when your directory changes
Review the permissions and click **Accept**.
Scribe only requests read-only access to your directory. No data is modified in your Entra ID. Scribe is SOC 2 Type II compliant. [Learn more about our security practices](/en/what-scribe-does-concerning-security).
## Step 4: Select teammates to sync
After authorization, the **Synchronize Teammates** modal appears. You have three ways to select which teammates to import:
### Teammates tab
Browse and select individual teammates from your directory. Use **Select all** to import everyone, or pick specific people.
### Units tab
Select entire organizational units to import all teammates within them at once. This is useful for large organizations where you want to sync specific departments.
### Groups tab
Select groups from your Entra ID directory. Use the **filter dropdown** to narrow by group type:
* **Microsoft 365 groups**
* **Email Enabled Security Groups**
* **Security Groups**
* **Distribution Groups**
This filter helps you quickly find the right group when your directory contains many groups of different types.
### Import options
At the bottom of the selection screen, you'll find two additional options:
* **Import email aliases**: Import aliases across your verified domains. Click the domain count to configure which domains to include.
* **Import shared mailboxes**: Import shared mailboxes from your Microsoft 365 tenant so you can assign signatures to them as well.
Both options are enabled by default.
## Step 5: Complete the sync
Once you've selected your teammates, click **Synchronize**. Scribe will import the selected teammates and their information.
Going forward, any changes in your Entra ID directory (new hires, departures, role changes) will automatically sync to Scribe based on your auto-sync preferences.
## Auto-sync settings
By default, Scribe automatically syncs new teammates added to your Entra ID directory. You can customize this behavior per unit or group:
* **Teammates**: Toggle auto-sync for all future teammates not assigned to a specific unit or group
* **Units**: Toggle auto-sync per organizational unit
* **Groups**: Toggle auto-sync per group
You can adjust these settings at any time from **Settings → Integrations → Microsoft Entra ID**.
## Troubleshooting
**I don't have the Global Admin role**
Ask your IT administrator to either complete the connection themselves, or grant you the Global Admin role temporarily. Scribe can send an invitation email to your admin on your behalf.
**The permissions consent screen shows an error**
Make sure you're signed into the correct Microsoft account with Global Admin privileges. If your organization has conditional access policies, check that they allow third-party app consent.
**Teammates are missing after sync**
Verify that the missing teammates are included in the units or groups you selected. You can always go back to **Settings → Integrations → Microsoft Entra ID** to adjust your selection.
# Teammate profile
Source: https://help.scribe-mail.com/en/teammates/teammate-profile
Manage a teammate in Scribe: edit their smart field details, assign signatures, install to their email client, and check each signature's installation status.
The teammate profile is where you view and manage a teammate's personal information, assigned signatures, and installation status. It's also where teammates can update their own details when invited to do so.
## Profile overview
At the top of the profile page, you'll find a summary card with the teammate's name, job position, and three key indicators:
* **Signature installed**: how many of their assigned signatures have been successfully deployed (e.g. 0/1, 2/2).
* **Information**: the percentage of profile fields that have been filled in.
* **Last updated**: when the profile was last modified. Hover to see the exact date and time.
## Personal information
The profile form displays the teammate's details as **Smart Fields**. Each field shows an icon indicating its data source:
* **Google Workspace** or **Microsoft Entra ID**: the field is synced from your directory. It's locked (indicated by a 🔒 icon) and can't be edited directly on the profile. To change it, either update it in your directory and wait for the next sync, or go to **Smart Fields** and switch the data source to Scribe.
* **HRIS**: the field is synced from your connected HR system. This is useful when your directory isn't up to date but your HRIS data is. Like directory-synced fields, HRIS fields are locked on the profile.
* **Scribe**: the field is stored in Scribe's own database and can be edited directly in the input.
You can connect your HRIS to Scribe to auto-fill teammate profiles with up-to-date information like job titles, phone numbers, or departments, even if your Google Workspace, Microsoft Entra ID or Zoho Mail directory is incomplete. Learn more about [HRIS integrations](/en/integrations-overview).
By default, only the main fields are visible: Profile picture, First name, Last name, and Job Position.
### Show unused Smart Fields
Toggle **Show unused Smart Field** at the bottom of the form to reveal additional fields like Work phone number, Mobile phone number, and any custom Smart Fields you've created. This is useful when you need to fill in or check data that isn't displayed by default.
If a field is locked because it's syncing from your directory, hover over the lock icon to see a tooltip explaining how to change it. You can switch any field's data source to Scribe on the [Smart Fields](/en/smart-fields) page if you need to override the directory value.
## Signatures
The right side of the profile shows the teammate's assigned signature preview. If a teammate has multiple email addresses or is assigned to multiple signatures, use the **dropdown** at the top of the Signatures section to switch between them.
**Microsoft users only:** the signature preview includes **Primary**, **Reply**, and **Internal** tabs, matching the three signature slots available in Outlook.
### Assign a signature
If no signature has been assigned yet, the Signatures section displays an empty state with an **+ Assign Signature** button. Click it to open the signature picker, browse your available signature templates, select one, and click **Assign Signature** to confirm.
You can also assign signatures in bulk from the [Signatures](/en/assign-teammates-to-a-signature) page.
## Install Signature
At the bottom of the profile, the **Install Signature** button lets you deploy the signature to the teammate's email client.
### When no integration is connected
Click the **Install Signature ▾** dropdown to see the available integrations you can connect:
* **Google Workspace**: installs via Google's API (server-side, no action needed from the teammate).
* **Microsoft Entra ID**: installs via Microsoft's API.
* **Front**, **Outreach**, **Salesloft**: installs to these third-party email platforms.
Select one to start the integration setup.
### When an integration is connected
Once signatures have been deployed, hover over the **Install Signature** button to see the **installation status table**:
| Column | Description |
| - | - |
| Signatures | The name of the assigned signature |
| Platform | Web or Mobile |
| Integration | The email client or platform (e.g. Outlook Windows, Apple Mail, Server Side) |
| Date | When the installation was attempted |
| Status | **Installed**, **Pending**, or **Failed** |
This table helps you monitor deployment and troubleshoot any issues at a glance.
### Copy HTML
The **Copy HTML ▾** button is always available below Install Signature. It lets you (or your teammate) copy the raw HTML of the signature to paste it manually into any email client or platform that doesn't offer an automated integration through Scribe.
## Teammate view (invited teammates)
When a teammate is invited by email to complete their profile, they see a simplified version of the app. Their navigation only includes two items: **Profile** and **Integrations**.
From this view, teammates can:
* **Edit fields** where the data source is set to Scribe: they can type directly in the input.
* **View but not edit** fields synced from a directory (Google Workspace, Microsoft Entra ID or Zoho Mail): these remain locked.
* **See their assigned signatures** and installation status.
Teammates invited to update their profile don't have access to the full Scribe dashboard. They can only see and edit their own information.
# Teammates overview
Source: https://help.scribe-mail.com/en/teammates/teammates-overview
View, manage, and monitor your Scribe teammates: from synced directory data and signature assignments to per-user signature installation status.
The Teammates page is your central hub for managing everyone who will receive an email signature. It shows you each teammate's data completeness, signature assignment, integration status, and installation progress, all in one place.
## Status bar
At the top of the page, four status indicators give you an at-a-glance overview of your deployment progress:
* **Synchronized**: How many teammates have been synced from your connected directory (e.g., 19/20)
* **Assigned to signatures**: How many teammates have a signature template assigned to them
* **Information Completed**: How many teammates have all their smart field data filled in
* **Installed signatures**: How many teammates have their signature actively installed in their email client
These counters help you quickly identify where attention is needed. For example, if "Information Completed" is behind, some teammates may be missing data, so their signatures will be published without the lines that data would fill.
## Searching and filtering
Use the **search bar** to find teammates by name. For more targeted views, click the **filter icon** to open the filter panel with four categories:
* **Email**: Filter by teammates with or without email aliases
* **Information**: Show only teammates with complete data (Filled) or those missing fields (Missing)
* **Integrations**: Filter by connected platform (e.g., Microsoft 365)
* **Installation**: Filter by deployment status: Installed, Not Installed, Pending, Partially Installed, or Failed
Use the "Information → Missing" filter to quickly find teammates who still need to complete their profile data before you can publish their signatures.
## The teammates table
Each row in the table represents one teammate and shows the following columns:
**Name**: The teammate's name, job title, and profile picture (if available). Some teammates show a "+1" badge indicating they have email aliases. Click the arrow next to a teammate's name to expand and see their alias email addresses.
**Signatures**: Which signature template is assigned to this teammate. Click to expand and see details including the email address, signature name, source (manual or automatic), and when it was assigned.
**Information**: A progress bar showing how complete the teammate's smart field data is, displayed as a percentage. Click to expand and see each smart field with its status (Filled or Missing), the data source it's connected to, and when it was last updated.
**Integrations**: Which email platform this teammate is connected through (e.g., Microsoft 365, Google Workspace, Zoho Mail).
**Installations**: The current deployment status for this teammate's signature. Click to expand and see details for each email address, including the platform, integration, date, and status. If a signature shows "Not activated," it means you need to go to the signature's overview page and click **Install signatures** to trigger the deployment. Signatures aren't installed automatically until you explicitly activate them from there.
**Actions**: Two quick-action buttons for each teammate:
* **Edit** (pencil icon): Open the teammate's profile to edit their information
* **Preview Signature** (eye icon): Open a live preview of this teammate's signature with their actual data
## Preview Signature
Clicking the eye icon on any teammate row opens the **Preview Signature** modal. This lets you see exactly how the teammate's signature will look in their email client before deploying it.
### Email client tabs
At the top of the modal, three tabs let you switch between email client previews:
* **Outlook**: Shows the signature as it appears in Microsoft Outlook
* **Gmail**: Shows the signature as it appears in Gmail
* **Apple Mail**: Shows the signature as it appears in Apple Mail
Each tab renders the signature within a realistic email client mockup, so you can see the full context, including sender name, subject line, and email body, just as the recipient would.
### Display options
The top-right area of the modal includes controls to adjust the preview:
* **Light / Dark mode** (sun/moon icons): Toggle between light and dark email themes to check how your signature renders in both modes.
* **Device icons** (desktop, tablet, mobile): Switch between screen sizes to verify your signature is responsive and looks good on all devices.
* **Send test email**: Send a real test email with the signature applied, so you can see the result directly in your inbox.
### Signature and slot selector
At the bottom-right of the preview, two controls let you navigate between signature variations:
* **Signature dropdown**: If the teammate has multiple email addresses or is assigned to multiple signatures, use the dropdown to switch between them (e.g., "Marketing UK"). The dropdown lists each email address and the signature assigned to it.
* **Primary / Reply / Internal tabs**: For Microsoft users, these tabs match the three signature slots available in Outlook, so you can preview what the teammate sees for each type of email.
## Syncing teammates
Scribe automatically syncs all connected directory sources once per day, based on your time zone. You can also click **Refresh** at any time to trigger a manual sync. After syncing, a notification shows the source and how recently it was refreshed (e.g., "Microsoft Entra ID, a few seconds").
Synced data flows one way, from your directory to Scribe. Changes to synced fields (like name or job title) should be made in your directory source, and they'll appear in Scribe after the next sync or manual refresh.
## Bulk actions
Select multiple teammates using the checkboxes on the left side of the table. A checkbox at the top of the column selects all visible teammates. When teammates are selected, two bulk action buttons appear:
* **Invite teammates** (envelope icon): Send an invitation email so teammates can access their own signature, add their personal information, and install it themselves. Invited teammates can only see their own signature. They won't have access to other parts of your Scribe workspace. Invited teammates can be managed in your Scribe settings under the Members tab.
* **Delete teammate's emails** (trash icon): Remove the selected teammates' emails from your Scribe teammate list. They will lose their signature but remain in your connected directory (e.g., Entra ID). A confirmation dialog appears before any deletion.
## Adding teammates
Click **+ Add Teammates** in the top right to add people to your Scribe workspace. The dropdown offers five methods, split into two categories:
**Automated**: Sync from integrations. These teammates are pulled from your connected directory and stay in sync automatically:
* **[Google Workspace](/en/integrations/teammates/google-workspace-teammates)**: Import users from your Google Workspace directory
* **[Microsoft Entra ID](/en/integrations/teammates/microsoft-entra-id-teammates)**: Import users from your Microsoft Entra ID (formerly Azure AD) directory
* **[Zoho Mail](/en/integrations/teammates/zoho-mail-teammates)**: Import users from your Zoho Mail organization
**Manual**: Add without an integration, useful for freelancers, contractors, or small teams that don't use a directory:
* **[Add manually](/en/teammates/add-teammates-manually)**: Opens a form where you enter the teammate's First Name, Last Name, Job Position, and Email (all required fields). Toggle "Add another teammate" to keep the form open after each addition so you can add multiple people in a row.
* **[Upload a CSV](/en/teammates/upload-csv)**: Bulk import teammates from a CSV file
For most companies with 250+ employees, connecting a directory integration is the recommended approach: it keeps teammate data in sync automatically and reduces manual upkeep. Manual addition works well for smaller teams or when you need to add a few people who aren't in your directory.
## Editing teammate selection
Click **Edit teammate selection** in the top right to manage which users from your connected directory are included as teammates in Scribe. This is where you control who gets a signature. You don't have to include everyone from your directory.
## Related articles
* [Teammate profile](/en/teammates/teammate-profile)
* [Members](/en/members)
* [Smart fields](/en/smart-fields)
# Upload a CSV
Source: https://help.scribe-mail.com/en/teammates/upload-csv
Import many teammates into Scribe at once by uploading a CSV file: only email is required, columns map automatically, and rows are validated before submitting.
Import multiple teammates at once by uploading a CSV file. This is the fastest way to [add teammates manually](/en/teammates/add-teammates-manually) when you don't use a directory integration.
## How to upload a CSV
1. Go to **Teammates** and click **+ Add Teammates** in the top-right corner.
2. Select **Upload a CSV** under the Manual section.
3. In the import modal, either **drag and drop** your CSV file or click **Upload file** to browse.
4. Review the imported data. Scribe will validate each row and flag any issues.
5. Click **Submit CSV** to import your teammates.
### CSV columns
Your file should include the following columns. Only **Email** is required; all other fields are optional.
| Column | Required | Description |
| - | - | - |
| Email | Yes | The teammate's email address |
| Job position | No | Their role or title |
| Phone number | No | Direct phone number |
| Meeting Link | No | Link to their scheduling page (e.g., Cal.com, Calendly) |
| Book a demo | No | Link to a demo booking page |
You don't need to match the column names exactly. Scribe will map your columns automatically when possible and let you adjust the mapping before import.
### Enter data manually
If you don't have a CSV file ready, click **Manually enter data** in the import modal to type directly into the spreadsheet grid. This can be handy for pasting data from another source.
### Validation
Before submitting, Scribe checks each row and categorizes it as **Valid** or **Invalid**. Common issues include missing or malformed email addresses. Fix any flagged rows directly in the grid before submitting.
If you later connect a directory integration ([Google Workspace](/en/integrations/teammates/google-workspace-teammates) or [Microsoft Entra ID](/en/integrations/teammates/microsoft-entra-id-teammates)), it will override your CSV-imported teammates. Only use this option if you don't plan to sync from a directory, or if you need to add people who aren't in your directory.
## Related articles
* [Teammates overview](/en/teammates/teammates-overview)
* [Smart fields](/en/smart-fields)
* [Teammate profile](/en/teammates/teammate-profile)
# What if my teammates manually edit their email signature?
Source: https://help.scribe-mail.com/en/what-if-my-teammates-manually-edit-their-email-signature
Scribe automatically overrides manual signature changes every time a teammate composes an email, so brand consistency is enforced without any effort.
It doesn't matter. Scribe overrides it automatically, every single time.
## Why this matters
Without centralized signature management, things drift fast. Common issues include:
* A teammate still using an **old job title** months after a promotion
* Someone replacing the **company logo** with a personal one
* A sales rep removing the **[campaign banner](/en/marketing-overview)** because they prefer a "cleaner" look
* New hires copy-pasting a **colleague's signature** with the wrong phone number
* A teammate adding **[social media icons](/en/editor/social-icons)** that link to personal accounts
These aren't edge cases. They happen in every company. And manually chasing people to fix their signatures doesn't scale.
## How Scribe handles it
Every time a teammate opens the compose window in Gmail or Outlook, Scribe [automatically injects the approved signature](/en/install-signatures), regardless of what's saved in their email client settings.
This means even if a teammate manually edits their signature in their email settings, the change only lasts until they compose their next email. Scribe will replace it with the correct, approved version again. They would have to re-edit their signature every single time they write an email, which effectively makes manual overrides pointless.
There's no monitoring delay, no periodic sync. It happens at the moment of composing, every time.
This is one of the key differences between Scribe and manually managing signatures. Even if your team follows instructions perfectly on day one, signatures inevitably drift over time. Scribe eliminates that problem entirely, without relying on anyone's discipline.
## Related articles
* [Do teammates need to install their own signature?](/en/do-my-teammates-have-to-be-involved-to-install-their-email-signature): how Scribe deploys centrally.
* [Create and manage signatures](/en/create-and-manage-signatures): publish design changes that push to everyone automatically.
* [Do I need Scribe?](/en/do-i-need-scribe): the signature drift and consistency problems Scribe solves.
# Which departments are involved in setting up Scribe?
Source: https://help.scribe-mail.com/en/which-departments-have-to-be-involved-in-the-set-up-of-scribe
Which teams need to be involved when deploying Scribe email signatures, from small companies to large enterprises with 5,000+ employees and IT controls.
It depends on the size of your organization. In most cases, only one or two departments need to be involved, and the time commitment for each is minimal.
## Small to mid-size companies (5 to 50 employees)
For smaller teams, one person can typically handle the entire setup. This is usually someone from the **Marketing department** or a **company founder** who has admin access to the email provider (Google Workspace, Microsoft 365 or Zoho Mail).
Since they have the permissions to [connect integrations](/en/integrations-overview), sync the team directory, and design signatures, no coordination with other departments is needed.
## Mid-size to enterprise companies (50 to 5,000+ employees)
For larger organizations, the setup is usually split between **Marketing and IT**:
| Department | Role in setup | Time commitment |
| - | - | - |
| **IT** | Connects the email provider, installs the Scribe integration, configures the [custom sending domain](/en/configure-your-sending-domain). This is a one-time setup. | \~10 minutes |
| **Marketing** | Designs the signature templates, assigns signatures to team members, and deploys them across the company. | \~15 to 20 minutes |
In some organizations, **Security** and **Legal** teams may also need to review the setup, particularly around data handling, SSO configuration, or compliance requirements. Scribe is SOC 2 Type II and [GDPR compliant](/en/security/how-does-scribe-comply-with-gdpr), which typically speeds up this review process.
## After setup
Once the initial configuration is done, Marketing operates Scribe independently. IT doesn't need to be involved for ongoing signature updates, campaign changes, or new employee onboarding. Scribe syncs your directory automatically and Marketing can deploy changes with one click.
This division of labor is one of the main reasons teams switch to Scribe: IT does a one-time 10-minute setup, and Marketing runs everything from there, with no dependencies and no delays.
## Related articles
* [How long does it take to set up Scribe?](/en/how-long-does-it-take-to-set-up-scribe): the time each team needs to invest.
* [Who is Scribe for?](/en/who-is-scribe-for): why Scribe is built for Marketing and IT together.
* [What Scribe does concerning security](/en/what-scribe-does-concerning-security): the compliance posture Security and Legal will review.
# Which fonts can I use in my Scribe email signature?
Source: https://help.scribe-mail.com/en/which-fonts-can-i-use-in-my-scribe-email-signature
Scribe supports 11 web-safe fonts that render consistently across Gmail, Outlook, Apple Mail, and every major email client used on desktop and mobile.
Scribe supports 11 web-safe fonts that are guaranteed to [display correctly across all major email clients](/en/are-scribe-email-signatures-compatible-with-all-email-clients).
## Why not custom or Google fonts?
Email clients don't work like web browsers. Browsers can load and render any font from the web, but email clients can't. Most email clients rely on a limited set of pre-installed fonts, and when they encounter a font they don't support, they silently replace it with a default system font.
This means a [signature designed](/en/editor/editor-overview) with a custom font might look exactly as intended in Gmail on Chrome, but completely different in Outlook on Windows, or on a recipient's mobile device. The sender never sees the difference, but the recipient does.
To ensure your signatures look consistent for every recipient, on every device, Scribe uses web-safe fonts only. These are fonts that are pre-installed on virtually all operating systems and supported by all email clients.
## Available fonts
* Helvetica
* Arial
* Arial Black
* Arial Narrow
* Tahoma
* Georgia
* Times
* Garamond
* Verdana
* Lucida
* Trebuchet
For a clean, modern look, **Helvetica** and **Arial** are the most popular choices. They're highly readable at small sizes and render consistently everywhere. **Georgia** is a great option if you prefer a serif font.
## Related articles
* [Text blocks](/en/editor/text-blocks): add and format text, including font, in the signature editor.
* [Styling panel](/en/editor/styling-panel): control fonts, colors, and spacing across a signature.
* [Do Scribe email signatures work on mobile?](/en/do-scribe-email-signatures-work-on-mobile): how signatures render on mobile devices.
# Who is Scribe for? Built for Marketing and IT teams
Source: https://help.scribe-mail.com/en/who-is-scribe-for
Scribe is built for Marketing and IT teams to work independently while keeping brand consistency, with IT setup that takes about 10 minutes.
### The only email signature management platform that Marketing and IT both love.
Scribe is designed to let Marketing and IT focus on what they do best. IT handles simple 10-minute integrations. From there, Marketing runs everything independently. No dependencies, no delays. Everyone saves time.
## How IT uses Scribe
IT's involvement is limited to a quick initial setup. Once done, Marketing takes over, with no more IT tickets about signatures.
Sync teammates, groups, or units from your Google Workspace Directory or Microsoft Entra ID.
Auto-fill personal information in signatures by connecting data from your email provider or HRIS. Signatures stay updated when changes happen.
Install the cloud-based Scribe add-on so Marketing can deploy signatures across all email platforms in one click.
Set up your custom domain for signature links to maintain security and avoid spam filters.
That's it. The whole process takes about 10 minutes. From there, Marketing runs Scribe independently without further intervention from IT.
Scribe is [SOC 2 Type II and GDPR compliant](/en/what-scribe-does-concerning-security), so you can rest assured your data is protected.
## How Marketing uses Scribe
Once IT has completed the initial setup, Marketing has full control over signature design, assignment, and deployment, with no technical skills needed.
Use the no-code editor to create signatures that match your company's visual identity. No design or coding skills required.
Tailor marketing messages for sales, support, marketing, and other departments, each with their own signature.
Assign signatures based on department, role, or individual details. One person or 1,000+, it's the same process.
One-click install across all email platforms. Zero actions needed from teammates. They won't even know Scribe exists.
Once that automation layer is running, you're one click away from updating signatures anytime. Deploy new calls-to-action, promotional banners, or campaign visuals across your entire team instantly.
Scribe's analytics show you the conversion rate for each marketing element in your signatures, so you can iterate quickly and stay data-driven.
### Want to go further?
Schedule multiple marketing campaigns simultaneously across different time zones to automatically update your team's signatures when you launch a new product, host a webinar, or promote an event. Signatures automatically revert to their default state once a campaign ends, leaving no more outdated information.
## From signature chaos to brand consistency in less than a week.
Branded email signatures shouldn't take months to deploy. Scribe is one of the fastest company-wide wins you'll implement.
* Connect your email provider
* Connect HRIS system to auto-fill signatures
* Install Scribe integrations
* Configure your own domain
* Design on-brand signatures
* Assign signatures to teammates
* Run internal tests
* Install signatures company-wide in one click
* 100% brand consistency achieved
* 12% average CTR on signature campaigns
* Zero IT tickets about signatures
* No more chasing team members for updates
# Why email signatures are an untapped marketing channel
Source: https://help.scribe-mail.com/en/why-email-signatures
See why company email is an underused marketing channel: the average employee sends 39 emails a day, and Scribe turns each one into on-brand reach.
Email is the one marketing channel your team uses every day, yet most companies waste it: every signature is free, on-brand reach you already paid for.
## On average, a company sends 1 million emails per year for every 100 employees.
That's a massive amount of interaction with your brand, and as many opportunities to promote it.
Yet in most companies, email signatures are self-made, off-brand, or outdated because managing them manually is painful. The result: hundreds of emails go out every day that either harm your brand image or miss the chance to drive traffic.
## Email signatures are an untapped marketing channel.
Data from Scribe customers shows that an employee sends an average of **39 emails per day**. For a company with 100 employees, that's **82,900 emails per month**.
With an average **12% click-through rate** on marketing elements embedded in signatures (like [calls to action and promotional banners](/en/marketing-overview)), that translates to **9,948 potential leads** redirected to your marketing content every month.
Unlike paid ads, where every impression has a cost, email signatures provide **free impressions** at scale. Even if your click-through rate is lower than 12%, the sheer volume of daily emails ensures a steady flow of organic traffic to your content.
## Scribe makes it easy to unlock this channel.
With fast implementation and powerful automation, Scribe lets you maintain brand consistency across every team member's signature while turning each one into a marketing asset, without asking your teammates to do anything. Design once in the [visual editor](/en/editor/editor-overview), personalize every signature automatically with [smart fields](/en/smart-fields), and roll it out to your whole team.
## Related articles
* [Campaigns and banners](/en/marketing-overview): turn every signature into a marketing channel with calls to action, promotional banners, and campaigns you control.
* [Signature editor](/en/editor/editor-overview): design on-brand signatures in a visual editor, no code required.
* [Smart fields](/en/smart-fields): personalize each teammate's details automatically so signatures stay accurate.
* [Analytics](/en/analytics-overview): track views, clicks, and click-through rate to see what your signatures drive.
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Account
Source: https://help.scribe-mail.com/en/account
Manage your personal Scribe profile across every workspace: update your name, email, and profile picture, change your password, and set cookie preferences.
The Account page manages your personal Scribe profile. Changes here apply to your account across all [workspaces](/en/workspaces) you belong to. They're not tied to any single workspace. Open it from **Account** in the settings sidebar.
## Profile
Update your profile picture, first name, last name, and email address. Click **Change Picture** to upload a new photo. You can change the email address associated with your Scribe account by editing the **Email** field. First name, last name, and email are all required fields.
## Privacy
Click **Change my cookie preferences** to manage your cookie and privacy settings.
## Password
Click **Change Password** to update your account password and [keep it secure](/en/security/how-do-i-configure-2fa-in-scribe).
## Related articles
* [Members](/en/members): manage who can access a workspace and what they can do.
* [Billing](/en/billing): manage your subscription, payment method, and invoices.
* [Sign in and sign up](/en/sign-in-and-sign-up): how to access your Scribe account.
# Scribe MCP server: manage email signatures with AI
Source: https://help.scribe-mail.com/en/ai-agents
Connect Claude, ChatGPT, or any MCP assistant to Scribe, listed in the Claude directory and ChatGPT plugin store, to manage email signatures by chat.
The Scribe MCP server lets your AI assistant manage your Scribe account by chatting with it. It is a hosted Model Context Protocol endpoint that connects assistants like Claude, ChatGPT, and Cursor to your email signatures, teammates, smart fields, campaigns, and analytics, so you can create and audit signatures in plain English instead of clicking through the dashboard.
Scribe is listed in the [Claude directory](https://claude.ai/directory/scribe-mail) and the [ChatGPT plugin store](https://chatgpt.com/plugins/plugin_asdk_app_6a511673beb08191964b117ec2730e24), the first email signature management platform available in both. Claude and ChatGPT users connect in one click from those listings. Every other MCP-capable assistant connects with this endpoint:
```
https://mcp.scribe-mail.com/mcp
```
* Connector name: `Scribe` (listed as `Scribe Mail` in the Claude directory)
* Auth: OAuth sign-in with your Scribe account, no API keys
* Scope: your workspace, with read actions auto-approved and writes confirmed
* Tools: 57 tools across 15 areas, see the [tools reference](/en/ai-agents/tools)
## Where to find Scribe
Listed as Scribe Mail under Sales and marketing, Legal, Data, and Communication. Click Connect to Claude, then sign in.
Listed as Scribe under Business and Operations. Click Install plugin, then sign in with Scribe.
Both listings run on the same hosted MCP server, so the tools, permissions, and confirmation rules are identical whichever way you connect.
## How does it work?
Add Scribe from the Claude directory or the ChatGPT plugin store, or paste the connector URL into any other MCP client, then sign in with your Scribe account.
Tell your assistant what you want, like building a signature or checking last quarter's clicks.
Your assistant calls the right Scribe tools for you, with no copy and paste.
You see the results, and any change is confirmed before it happens.
## What can an AI agent do with Scribe?
Each example below is a prompt you type to your assistant. Read actions return an answer right away. Write actions ask you to confirm before anything changes.
| Scenario | Example prompt to your assistant | Outcome |
| - | - | - |
| Design a signature template | "Create a signature called Sales 2026 with our logo, each person's title and phone, and LinkedIn and X icons, then show me the draft before publishing" | A draft signature built and shown for your approval before it goes live |
| Audit install and compliance status | "Which signatures are published, who are they assigned to, and are any integrations failing?" | A read-only report of published templates, assignment coverage, and integration errors |
| Look up teammate and smart field data | "List teammates who are missing a job title or a phone number" | A read-only list of teammates with gaps in their smart field data |
| Automate workspace setup | "Create a folder called Sales, add these three teammates, and set their job titles" | Folders, teammates, and fields created, with each change confirmed first |
| Track campaign performance | "Show views and clicks for our spring banner campaign, week by week" | A read-only performance breakdown for the campaign over time |
| Measure clicks and clickthrough rate | "Rank our signatures by clickthrough rate over the last 90 days" | A read-only ranking of signatures by views, clicks, and clickthrough rate |
| Export engagement data | "Give me signature engagement by country for last quarter as a table" | A read-only dataset your assistant can format as a table or CSV |
## Before you connect
**What connecting means**
Signing in authenticates the assistant as you, in your workspace only. Read actions like listing and reporting run automatically. Write actions like creating, updating, deleting, and publishing ask for your confirmation first. Scribe uses OAuth, so no API key is stored in your assistant.
## Set up Scribe MCP
One-click setup from the Claude directory and ChatGPT plugin store, plus Cursor, Codex, and more
The terminal companion: local MCP for coding agents, plus shell commands
Give your assistant the full Scribe workflow
Fix connection and tool issues
Access, data safety, supported assistants
Every Scribe MCP tool, grouped by area
## Related
The data that populates your signatures
The people your signatures deploy to
Views, clicks, and clickthrough rate
Connect your directory, HRIS, and mail
The REST API behind the MCP server
# Scribe CLI: your signatures in the terminal and local agents
Source: https://help.scribe-mail.com/en/ai-agents/cli
Install the Scribe CLI, sign in once, and manage signatures from your terminal, or serve every Scribe tool to a local AI agent over MCP.
The Scribe CLI (`@scribemail/cli`) brings the full Scribe tool surface to your machine. It has two faces:
* **A local MCP server**: `scribe mcp` serves the exact same tools as the hosted MCP server to any agent that can launch a command (Claude Code, Claude Desktop, Cursor, and any stdio MCP client), running as you after a single browser sign-in.
* **A regular command line**: every tool is also a subcommand (`scribe signatures list`, `scribe campaigns schedule`), with JSON output built for scripts and shells.
Both are generated from the same code as the hosted server at `mcp.scribe-mail.com`, so the tools, names, and behavior never drift.
## Install and sign in
Requires Node.js 20 or newer.
```bash theme={null}
npm install -g @scribemail/cli
```
```bash theme={null}
scribe login
```
Your browser opens and you sign in with your Scribe account, with no API key to create or paste. Credentials are stored in `~/.config/scribe/credentials.json` with owner-only permissions and refresh automatically.
```bash theme={null}
scribe whoami
```
Shows the signed-in user, workspace, and token state.
The signed-in member must be a workspace **owner or admin**, and the workspace plan must include API access. One login is bound to one workspace. Run `scribe login` again to switch.
## Serve a local agent over MCP
```bash theme={null}
claude mcp add --scope user scribe -- scribe mcp
```
For clients configured with JSON (Claude Desktop, Cursor, and others):
```json theme={null}
{
"mcpServers": {
"scribe": {
"command": "scribe",
"args": ["mcp"]
}
}
}
```
Prefer the CLI over the hosted endpoint when your agent runs locally and you want tool calls to run as your already-signed-in terminal session, or when your client only speaks stdio. The hosted endpoint (see [Connect your assistant](/en/ai-agents/connect)) remains the right choice for chat assistants like Claude on the web and ChatGPT.
## Use it from the shell
Results are JSON on stdout; errors are readable text on stderr.
```bash theme={null}
scribe signatures list --limit 10
scribe signatures create --name "Sales" --draft-content @tree.json
scribe signatures publish --id 0c9f…
scribe teammates list --auto-paginate
scribe analytics views --start-date 2026-07-01 --end-date 2026-08-01 --group-by signature_template
scribe docs search "dns setup"
```
Useful conventions:
* `scribe tools` lists every MCP tool and its CLI command; `scribe call --json '{...}'` calls any tool by its exact MCP name.
* Complex fields like signature content trees accept inline JSON, `@file`, or `-` for stdin. `--json` can supply the whole arguments object, and explicit flags override it.
* Booleans are `--flag` / `--no-flag`; leaving both off omits the field, so partial updates never overwrite values by accident.
* Exit codes: `0` success, `1` API or tool error, `2` usage error, `3` not signed in.
## Commands by area
| Group | Commands |
| - | - |
| `signatures` | `list` `create` `update` `delete` `publish` `install` `preview` `html` `installations` |
| `signatures variants` | `list` `update` `publish` `delete` |
| `signatures recipients` | `list` `add` `remove` `set-rules` `add-entities` `remove-entities` |
| `teammates`, `emails`, `smart-fields`, `folders`, `assets` | `list` `create` `update` `delete` |
| `campaigns` | `list` `create` `update` `delete` `preview` `schedule` `pause` `resume` |
| `analytics` | `views` `clicks` `events` `events-summary` |
| `visitors` | `list` `get` `breakdown` |
| `integrations` | `list` `entities` |
| Top-level | `workspace` · `billing documents` · `content-schema` · `docs search` · `docs read` · `feedback` |
| Session | `login` · `logout` · `whoami` · `mcp` · `tools` · `call` |
The per-tool behavior is identical to the MCP tools. See the [Tools reference](/en/ai-agents/tools).
## Working over SSH
Signing in needs a browser that can reach `127.0.0.1` on the machine running the CLI. On a remote machine, forward the callback port and print the URL instead of opening a browser:
```bash theme={null}
ssh -L 8976:127.0.0.1:8976 yourserver
scribe login --no-browser
```
Then open the printed URL in your local browser.
## Next steps
Every Scribe tool, grouped by area
Give your assistant the full Scribe workflow
Fix connection and tool issues
The REST API behind the CLI and MCP server
# Connect your AI assistant to Scribe
Source: https://help.scribe-mail.com/en/ai-agents/connect
Add Scribe from the Claude directory or ChatGPT plugin store in one click, or connect Cursor, Codex, and any MCP client to the Scribe MCP server.
Connect any MCP-capable assistant to Scribe in a couple of minutes. Claude and ChatGPT users install Scribe in one click from the [Claude directory](https://claude.ai/directory/scribe-mail) and the [ChatGPT plugin store](https://chatgpt.com/plugins/plugin_asdk_app_6a511673beb08191964b117ec2730e24). Every other client uses the endpoint below, which is the same everywhere. In every case you sign in with your Scribe account (OAuth), so no API key is pasted in.
```text theme={null}
https://mcp.scribe-mail.com/mcp
```
Read actions run automatically once connected. Write actions ask you to confirm first. For what the connection can access, see the [FAQ](/en/ai-agents/faq).
## Chat assistants
### Connect Claude to Scribe
Scribe is listed in the Claude directory as **Scribe Mail**, so there is nothing to type. Works on all Claude plans, on web and desktop.
1. Open the [Scribe Mail listing](https://claude.ai/directory/scribe-mail) in the Claude directory, then click **Connect to Claude**.
2. Sign in with your Scribe account if prompted, choose the organization to connect, review the access, then click **Allow access**.
3. Done. The listing now shows **Connected**, and Scribe appears in your connectors.
Open a new chat and ask Claude to manage your account through the Scribe connector, from creating a signature to pulling your analytics.
### Connect ChatGPT to Scribe
Scribe is listed in the ChatGPT plugin store, so you install it like any other ChatGPT app, with no Developer Mode needed. Sign in to ChatGPT on the web first.
1. Open the [Scribe plugin page](https://chatgpt.com/plugins/plugin_asdk_app_6a511673beb08191964b117ec2730e24), or open **Plugins** in the sidebar and search for Scribe, then click **Install plugin**.
2. In the **Add Scribe to ChatGPT** dialog, click **Sign in with Scribe**.
3. Sign in with your Scribe account, review the access, then click **Allow access**.
4. Scribe is installed. Click **Try in chat**, or pick one of the example prompts on the listing.
5. In any chat, type `@Scribe` followed by your request, or open the plus menu and select the **Scribe** plugin.
6. Ask ChatGPT to manage your Scribe account, from creating a signature to pulling your analytics.
### Connect Mistral Vibe to Scribe
Works on the free plan.
1. In Mistral Vibe, open **Context**, go to **Connectors**, then click **Add Connector**.
2. Open the **Custom MCP Connector** tab. Name it `Scribe`, paste the URL below into **Server**, leave the authentication method on **OAuth2.1**, then click **Connect**:
```text theme={null}
https://mcp.scribe-mail.com/mcp
```
3. Sign in with your Scribe account if prompted, review the access, then click **Allow access**.
4. Done. Scribe is connected, and you can review its tools under **Functions** whenever you need.
Open a new chat, select the **Scribe** connector, then ask Mistral Vibe to manage your account, from creating a signature to pulling your analytics.
### Connect Grok to Scribe
Requires a paid account.
1. On grok.com, open the **+** menu in the message composer, then click **Add connector**.
2. In the **New Connector** dialog, choose **Custom** to add your own connector.
3. Name it `Scribe`, paste the URL below into **Server URL**, then click **Add Connector**:
```text theme={null}
https://mcp.scribe-mail.com/mcp
```
4. Sign in with your Scribe account if prompted, review the access, then click **Allow access**.
Scribe is connected. Open the **+** menu, go to **Connectors**, enable **Scribe**, then ask Grok to manage your account, from creating a signature to pulling your analytics.
### Connect Gemini to Scribe
Set up by your Google Workspace admin in Gemini Enterprise, from the Google Cloud console.
1. The admin adds a custom MCP server data store and enters the URL:
```text theme={null}
https://mcp.scribe-mail.com/mcp
```
2. The admin registers an OAuth client (a client id and secret plus a redirect), then authorizes it.
3. The admin enables the Scribe tools for users.
### Connect Microsoft Copilot to Scribe
A two-role setup: an admin or maker builds a Scribe agent once in `Copilot Studio`, then the team chats with that published agent. Plain Copilot chat does not get the Scribe tools on its own.
**Prerequisites**
* A `Microsoft 365 Copilot` seat for each person who will use it
* `Copilot Studio` capacity for the person who sets it up
* Generative orchestration enabled on the agent
**Set up (admin or maker)**
These steps follow Microsoft's [Add an existing MCP server to an agent](https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent) guide, with the Scribe values filled in.
1. Open or create an agent in `Copilot Studio`, then go to **Tools**, **Add a tool**, **New tool**, **Model Context Protocol**.
2. In **Add a Model Context Protocol server**, set the **Server name** to `Scribe`, add a short **Server description**, then paste the URL into **Server URL** as a streamable endpoint:
```text theme={null}
https://mcp.scribe-mail.com/mcp
```
3. Set **Authentication** to **OAuth 2.0**, then choose **Dynamic discovery** so Copilot registers itself automatically, since Scribe supports OAuth dynamic client registration. Click **Create**, then enable the tool.
4. Enable generative orchestration if it is not already on.
5. Publish the agent.
6. Under **Channels**, make it available where the team works, in Microsoft Teams or the `Microsoft 365 Copilot` app.
**How your team uses it**
1. Open the published Scribe agent in Microsoft Teams or the `Microsoft 365 Copilot` app.
2. Manage Scribe by chatting with it.
Writes ask for confirmation before anything changes.
A tenant-wide federated connector surfaces Scribe for retrieval and grounding in Copilot chat. The published-agent route above is what enables actions like creating signatures and installing to the team.
### Connect DeepSeek to Scribe
The DeepSeek app has no built-in connector. Use Scribe through any MCP-capable client, such as Claude or Cursor, with DeepSeek selected as the model.
### Connect Qwen to Scribe
Use Qwen Code, the command-line tool. The Qwen chat app has no connector.
Add Scribe to its `settings.json` under `mcpServers`, then complete the sign-in on first connect:
```json theme={null}
{
"mcpServers": {
"scribe": {
"type": "http",
"url": "https://mcp.scribe-mail.com/mcp"
}
}
}
```
## Coding assistants
### Connect a local agent through the Scribe CLI
Install the CLI, sign in once in your browser, and serve every Scribe tool to a local agent over stdio. There is no remote connector to set up, and it works with any MCP client that can launch a command:
```bash theme={null}
npm install -g @scribemail/cli
scribe login
claude mcp add --scope user scribe -- scribe mcp
```
For clients configured with JSON (Claude Desktop, Cursor, …):
```json theme={null}
{
"mcpServers": {
"scribe": {
"command": "scribe",
"args": ["mcp"]
}
}
}
```
Every tool is also a direct shell command (`scribe signatures list`, `scribe teammates create --email jane@acme.com`, `scribe tools` for the full list), handy for scripts and agents that prefer the shell. Full guide: [Scribe CLI](/en/ai-agents/cli).
### Connect Claude Code to Scribe
Add the server, then verify it:
```bash theme={null}
claude mcp add --transport http scribe https://mcp.scribe-mail.com/mcp
claude mcp list
```
Sign in to Scribe on first use.
Prefer a local server? Install the [Scribe CLI](#connect-cli) and run `claude mcp add --scope user scribe -- scribe mcp` instead.
### Connect Cursor to Scribe
Add Scribe to `~/.cursor/mcp.json` for all projects, or `.cursor/mcp.json` for one project. Reload the window, then sign in on connect:
```json theme={null}
{
"mcpServers": {
"scribe": {
"type": "http",
"url": "https://mcp.scribe-mail.com/mcp"
}
}
}
```
Or add it in one click:
### Connect Codex to Scribe
Add the server, which writes `~/.codex/config.toml`, then sign in with OAuth:
```bash theme={null}
codex mcp add scribe --url https://mcp.scribe-mail.com/mcp
```
### Connect Hermes to Scribe
Add the server with OAuth. A browser opens for sign-in on first connect:
```bash theme={null}
hermes mcp add scribe --url https://mcp.scribe-mail.com/mcp
```
### Connect OpenClaw to Scribe
Add a `mcpServers` entry to `~/.openclaw/openclaw.json`, or use `mcporter`:
```json theme={null}
{
"mcpServers": {
"scribe": {
"type": "http",
"url": "https://mcp.scribe-mail.com/mcp"
}
}
}
```
## Next steps
Give your assistant the full Scribe workflow
Every Scribe MCP tool, grouped by area
Fix connection and tool issues
Access, data safety, supported assistants
# Scribe MCP server FAQ
Source: https://help.scribe-mail.com/en/ai-agents/faq
Answers on the Scribe MCP server: Claude directory and ChatGPT plugin store listings, access scope, data safety, and supported AI assistants.
Common questions about connecting an AI assistant to Scribe through the MCP server.
## What access does the connection have?
The connection acts as you in one workspace. It can read your signatures, teammates, smart fields, folders, assets, integrations, campaigns, and analytics, and it can make changes only after you confirm each write.
## Is my data safe?
Yes. Scribe signs you in with OAuth, stores no API key from your assistant, and scopes every action to your own workspace. Read actions run automatically, and write actions ask for your confirmation first.
## Is Scribe in the Claude directory and the ChatGPT plugin store?
Yes. Scribe is the first email signature management platform listed in both. In the [Claude directory](https://claude.ai/directory/scribe-mail) it appears as Scribe Mail under Sales and marketing, Legal, Data, and Communication, and you connect with one click. In the [ChatGPT plugin store](https://chatgpt.com/plugins/plugin_asdk_app_6a511673beb08191964b117ec2730e24) it appears as Scribe under Business and Operations, and you install it like any other ChatGPT app, with no Developer Mode needed. Both listings were added in August 2026 and run on the same hosted MCP server.
## Which assistants are supported?
Any assistant that supports MCP connectors works. Claude and ChatGPT install Scribe from their directories. Documented flows also cover Mistral Vibe, Grok, Gemini, and Microsoft Copilot for chat, and Claude Code, Cursor, Codex, Hermes, and OpenClaw for coding.
## Do I need an API key?
No. Every connection signs in with your Scribe account through OAuth, and your assistant forwards your own access token. No API key is created or stored.
## Keep going
Set up Claude, ChatGPT, Cursor, and more
Every Scribe MCP tool, grouped by area
# Scribe skills for AI agents
Source: https://help.scribe-mail.com/en/ai-agents/skills
Paste a Scribe skill into your AI assistant so it manages signatures, teammates, campaigns, and analytics in the fewest steps from a cold start.
Your assistant can already discover the signature format on its own through the `get_content_schema` tool. Paste a skill below to give it the full Scribe workflow as well, so it works in the fewest steps from a cold start.
## Choose a skill
Start with the core **Scribe** skill for everything in one file, or pick a focused skill scoped to one job:
* **Scribe** is the full workflow: signatures and variants, teammates, smart fields, folders, assets, integrations, campaigns, analytics, and visitors.
* **Scribe signature design** builds render-safe, on-brand signatures, previews them, manages reply and internal variants, and organizes templates.
* **Scribe teammates and smart fields** manages teammates and their emails, the smart fields that populate signatures, and who each signature is assigned to.
* **Scribe campaigns** plans, schedules, and runs banner campaigns inside signatures.
* **Scribe analytics** pulls views, clicks, conversions, revenue, and identified-visitor data.
## Copy a skill
```markdown theme={null}
---
name: scribe
description: >-
Create and manage Scribe email signatures, audit installs, read teammate and
smart-field data, run marketing campaigns, and pull analytics through the
Scribe MCP server. Use when the user wants to create, edit, preview, publish,
or audit email signatures; manage reply and internal variants; add or look up
teammates; read or set smart fields; organize folders or assets; run or report
on marketing campaigns; or pull signature analytics, conversions, and visitors
in Scribe.
---
# Scribe
Manage a Scribe workspace through the Scribe MCP server: signatures and their
reply and internal variants, teammates, smart fields, folders, assets,
integrations, marketing campaigns, analytics, and visitors.
## When to use this skill
Use it whenever the user wants to:
- create, edit, preview, publish, install, or audit email signatures
- add a reply or internal signature variant, or read the installed HTML
- assign signatures to teammates, org units, or rule-based audiences
- add, update, or look up teammates and their email aliases
- read or set smart fields (the merge fields that populate signatures)
- organize folders or upload assets (logos, banners, pictures)
- create, schedule, pause, or report on marketing campaigns
- pull signature analytics (views, clicks, conversions, revenue)
- look up identified visitors and where they came from
## Connection
- Endpoint: `https://mcp.scribe-mail.com/mcp`
- Auth: OAuth sign-in as the user. No API keys are pasted into the client.
- Scope: one user in one workspace. Read tools run automatically. Write tools
(create, update, delete, publish) ask the user for confirmation in the app.
## Core workflow: create a signature in the fewest calls
From a cold session, a complete signature takes three calls:
1. Call `get_content_schema` first. In one response it returns the strict
block-tree schema, a flat lookup of every allowed enum value (including the
non-obvious icon names such as `linkedin-in`, `facebook-f`), and a complete
worked example with a populated social-icon row.
2. Adapt that example into a `draft_content` block tree and call
`create_signature` with a `name` and the `draft_content`.
3. Call `publish_signature` to copy the draft into the live `content` and trigger
installation.
To check the result before going live, call `preview_signature` on the draft and
read the returned HTML for layout and spacing, then publish.
Do not hand-write a block tree or guess enum spellings. Always call
`get_content_schema` before any `create_signature`, `update_signature`,
`update_signature_variant`, or marketing-campaign `content` write. An invalid
tree returns a 422 that names each offending field.
## Common patterns
- Audit installs: `list_signatures` (which templates are published and
activated), then `list_signature_recipients` (who each one covers), then
`list_integrations` (any failing connections).
- Verify a signature: `preview_signature` to check the draft layout before you
publish, and `get_signature_html` to read what a specific recipient receives
once it is live.
- Add a reply or internal variant: `get_content_schema`, then
`update_signature_variant` to stage the variant draft, then
`publish_signature_variant`. Variants need an active Microsoft 365 signatures
integration.
- Look up teammate data: `list_teammates` (emails and smart-field values), with
`list_smart_fields` for the field catalog.
- Fill gaps: read with `list_teammates`, then set values with `update_teammate`.
- Target a signature: `set_signature_recipient_rules` for auto-assign and
conditions, `add_signature_recipients` for specific emails, or
`add_signature_recipient_entities` for directory org units and groups.
- Run a campaign: `create_marketing_campaign`, then
`schedule_marketing_campaign`.
- Report engagement: `get_analytics_views` and `get_analytics_clicks` for totals
and a time series, or set `group_by` to rank signatures, teammates, campaigns,
or countries. There is no clickthrough-rate field, so compute it as clicks
divided by views.
- Report conversions: `get_analytics_events_summary` for conversion and revenue
totals and rankings, and `list_analytics_events` to inspect the raw events.
- Attribute customers: `list_visitors` and `get_visitor` for identified
end-users, and `get_visitor_breakdown` to rank which signature or teammate
acquired the most.
## Tool reference
Access key: Read runs automatically, Write asks for confirmation, Delete asks for
confirmation and is destructive.
### Schema
| Tool | Access | What it does |
| --- | --- | --- |
| `get_content_schema` | Read | Returns the signature block-tree schema, all enum values, and a worked example. Call before authoring content |
### Signatures
| Tool | Access | What it does |
| --- | --- | --- |
| `list_signatures` | Read | List signature templates (block trees omitted unless you pass `include_content`) |
| `create_signature` | Write | Create a template, staged as `draft_content` until you publish |
| `update_signature` | Write | Update a template by id, staged as a draft until you publish |
| `preview_signature` | Read | Render a draft or published template to HTML with placeholder values to check layout |
| `get_signature_html` | Read | Get the real installed HTML of a published signature for a specific recipient |
| `publish_signature` | Write | Publish a template so the draft becomes live and installs |
| `install_signature` | Write | Install the current live content without publishing |
| `delete_signature` | Delete | Delete a template and unassign it from teammates |
### Signature variants
A variant is an alternate signature shown on reply emails or on internal
(same-domain) emails. Variants require an active Microsoft 365 signatures
integration; without it, variant writes return a 409 `variants_unavailable`.
| Tool | Access | What it does |
| --- | --- | --- |
| `list_signature_variants` | Read | List a signature's reply and internal variants with their state and content |
| `update_signature_variant` | Write | Create or update a reply or internal variant, staged as a draft until you publish |
| `publish_signature_variant` | Write | Publish a variant so its draft becomes live and redeploys |
| `delete_signature_variant` | Delete | Reset a variant back to the primary signature (the record is kept) |
### Signature recipients
| Tool | Access | What it does |
| --- | --- | --- |
| `list_signature_recipients` | Read | List who a signature is assigned to, with the targeting rules |
| `add_signature_recipients` | Write | Assign a signature to a batch of teammate emails |
| `remove_signature_recipients` | Write | Remove manually assigned recipients from a signature |
| `set_signature_recipient_rules` | Write | Set auto-assign and the smart-field condition rules |
| `add_signature_recipient_entities` | Write | Target a signature at directory org units or groups |
| `remove_signature_recipient_entities` | Write | Untarget directory org units or groups |
### Teammates
| Tool | Access | What it does |
| --- | --- | --- |
| `list_teammates` | Read | List teammates with their emails and smart-field values |
| `create_teammate` | Write | Add a teammate from an email and optional field values |
| `update_teammate` | Write | Set a teammate's smart-field values |
| `delete_teammate` | Delete | Soft-delete a teammate |
### Emails
| Tool | Access | What it does |
| --- | --- | --- |
| `list_emails` | Read | List teammate emails (primary and aliases) |
| `create_email` | Write | Add an alias email to a teammate |
| `update_email` | Write | Change an email address |
| `delete_email` | Delete | Soft-delete an alias email (a primary email cannot be deleted) |
### Smart fields
| Tool | Access | What it does |
| --- | --- | --- |
| `list_smart_fields` | Read | List smart-field definitions with kind and data source |
| `create_smart_field` | Write | Define a custom field, optionally synced from an integration |
| `update_smart_field` | Write | Update a custom field or its integration link |
| `delete_smart_field` | Delete | Delete a custom field and its values on every teammate |
### Folders
| Tool | Access | What it does |
| --- | --- | --- |
| `list_folders` | Read | List signature folders with their signature counts |
| `create_folder` | Write | Create a folder to organize templates |
| `update_folder` | Write | Rename a folder |
| `delete_folder` | Delete | Delete a folder (it must be empty first) |
### Assets
| Tool | Access | What it does |
| --- | --- | --- |
| `list_assets` | Read | List the image library (logos, banners, pictures) |
| `create_asset` | Write | Upload an image from base64 or a source URL |
| `update_asset` | Write | Update an asset's name or role |
| `delete_asset` | Delete | Delete an asset (in-use assets are soft-deleted so they keep rendering) |
### Integrations
| Tool | Access | What it does |
| --- | --- | --- |
| `list_integrations` | Read | List active integrations with status and any error details |
| `list_integration_entities` | Read | List directory org units and groups to target a signature at |
### Financial documents
| Tool | Access | What it does |
| --- | --- | --- |
| `list_financial_documents` | Read | List invoices and credit notes with downloadable PDF links |
### Workspace
| Tool | Access | What it does |
| --- | --- | --- |
| `get_workspace` | Read | Read the workspace plan, status, and invoiced seat count |
### Analytics
There is no clickthrough-rate field. Pair `get_analytics_views` with
`get_analytics_clicks` and compute clicks divided by views.
| Tool | Access | What it does |
| --- | --- | --- |
| `get_analytics_views` | Read | Signature views over a date range, as a time series or a ranked breakdown |
| `get_analytics_clicks` | Read | Signature clicks over a date range, as a time series or a ranked breakdown |
| `get_analytics_events_summary` | Read | Aggregated conversion and revenue numbers, as a time series or a ranked breakdown |
| `list_analytics_events` | Read | List the raw recorded conversion events behind the analytics |
### Visitors
Visitors are the workspace's own identified end-users (from `identify` calls),
not Scribe teammates.
| Tool | Access | What it does |
| --- | --- | --- |
| `list_visitors` | Read | List identified visitors with traits and first-touch attribution |
| `get_visitor` | Read | Get one identified visitor with traits, attribution, and lifetime engagement |
| `get_visitor_breakdown` | Read | Rank which signature or teammate acquired the most identified visitors |
### Marketing campaigns
| Tool | Access | What it does |
| --- | --- | --- |
| `list_marketing_campaigns` | Read | List campaigns with status, targeting, and content |
| `create_marketing_campaign` | Write | Create a campaign draft with a name and time window |
| `update_marketing_campaign` | Write | Update a campaign by id |
| `schedule_marketing_campaign` | Write | Activate or schedule a draft or paused campaign |
| `pause_marketing_campaign` | Write | Pause an active campaign |
| `resume_marketing_campaign` | Write | Resume a paused campaign |
| `delete_marketing_campaign` | Delete | Delete a campaign (an active one stops first) |
## Important notes
- Always call `get_content_schema` before writing any signature `draft_content`,
variant `draft_content`, or campaign `content`. It is the fastest path to a
valid block tree.
- Writes are staged. `create_signature` and `update_signature` set
`draft_content`; the live `content` changes only when you call
`publish_signature`. Variants stage and publish the same way through
`update_signature_variant` and `publish_signature_variant`.
- `preview_signature` renders placeholder values for a layout check and needs no
recipient. `get_signature_html` returns the real installed HTML for one
recipient and is empty until the signature is published.
- Signature variants need an active Microsoft 365 signatures integration.
Without it, variant writes return a 409 `variants_unavailable`.
- Analytics has no clickthrough-rate field. Compute it as clicks divided by
views. Analytics ranges default to the last two months, and `hour` granularity
is capped at a 31-day range.
- Some actions are blocked when a directory integration (Google Workspace,
Microsoft Entra ID or Zoho Mail) manages the team list. Creating or deleting
teammates and emails then returns a 409.
- Default and integration-synced fields are read-only. Setting them is skipped or
returns a 422.
- List tools are paginated with `limit` (1 to 100); some use a `cursor` and
others a `page`, and several support a bounded `auto_paginate` with `max_pages`
(cap 20).
- Every write asks the user to confirm in the connected app, and every action is
scoped to the user's own workspace.
```
```markdown theme={null}
---
name: scribe-signature-design
description: >-
Design render-safe, on-brand Scribe email signatures. Use when the user wants
to build, restyle, or fix the layout of a signature, add a logo or banner, set
up social icons, preview rendering, manage reply or internal variants, or
organize templates into folders. Always reads the content schema before writing
content.
---
# Scribe signature design
Build valid, render-safe signature layouts through the Scribe MCP server.
## When to use
- Create a signature from a brief, an example, or a screenshot
- Restyle an existing signature or fix layout and spacing
- Add a logo, banner, or social-icon row
- Match a brand's colors, fonts, and structure
- Preview rendering before publishing, or read a recipient's installed HTML
- Add a reply or internal variant of a signature
- Organize templates into folders
## Workflow
1. Call `get_content_schema` first. It returns the block-tree schema, every
allowed enum value (including icon names like `linkedin-in`, `facebook-f`),
and a worked example. Never hand-write a tree or guess enum spellings.
2. Adapt the example into `draft_content` and call `create_signature` or
`update_signature`.
3. Call `preview_signature` and read the returned HTML to check layout and
spacing while it is still a draft.
4. Call `publish_signature` to make it live, or `install_signature` to install
the current live content without publishing.
## Variants
A variant is an alternate signature shown on reply emails or on internal
(same-domain) emails. Call `get_content_schema`, stage the variant with
`update_signature_variant`, then `publish_signature_variant`. Variants need an
active Microsoft 365 signatures integration; without it, variant writes return a
409 `variants_unavailable`.
## Tool reference
Access key: Read runs automatically, Write asks for confirmation, Delete is
destructive.
| Tool | Access | What it does |
| --- | --- | --- |
| `get_content_schema` | Read | Returns the block-tree schema, all enum values, and a worked example. Call before authoring content |
| `list_signatures` | Read | List signature templates |
| `create_signature` | Write | Create a template, staged as draft until you publish |
| `update_signature` | Write | Update a template, staged as draft until you publish |
| `preview_signature` | Read | Render a draft or published template to HTML with placeholder values to check layout |
| `get_signature_html` | Read | Get the real installed HTML of a published signature for a specific recipient |
| `publish_signature` | Write | Publish so the draft becomes live and installs |
| `install_signature` | Write | Install the current live content without publishing |
| `delete_signature` | Delete | Delete a template and unassign it |
| `list_signature_variants` | Read | List a signature's reply and internal variants |
| `update_signature_variant` | Write | Create or update a reply or internal variant, staged as a draft |
| `publish_signature_variant` | Write | Publish a variant so its draft becomes live |
| `delete_signature_variant` | Delete | Reset a variant back to the primary signature |
| `list_folders` | Read | List signature folders with counts |
| `create_folder` | Write | Create a folder to organize templates |
| `update_folder` | Write | Rename a folder |
| `delete_folder` | Delete | Delete a folder (must be empty first) |
| `list_assets` | Read | List the image library (logos, banners, pictures) |
| `create_asset` | Write | Upload an image from base64 or a source URL |
| `update_asset` | Write | Update an asset's name or role |
| `delete_asset` | Delete | Delete an asset (in-use assets are soft-deleted) |
## Rendering notes
- Keep layouts table-based and inline-styled so they hold up in Outlook, Gmail,
and Apple Mail.
- `preview_signature` shows placeholder values and needs no recipient, so use it
to verify a draft. `get_signature_html` returns the real installed HTML for one
recipient and is empty until the signature is published.
- An invalid tree returns a 422 that names each offending field. Fix and retry.
```
```markdown theme={null}
---
name: scribe-teammates-and-smart-fields
description: >-
Manage Scribe teammates, their emails, and the smart fields that populate
signatures, and control who each signature is assigned to. Use when the user
wants to add or look up teammates, audit missing data, read or set merge
fields, or target a signature at people, org units, or rule-based audiences.
---
# Scribe teammates and smart fields
Manage who is on the team, the data that fills signatures, and who gets which
signature.
## When to use
- Add, update, or look up teammates and their email aliases
- Find teammates missing a job title, phone, or other field
- Read the smart-field catalog or set custom field values
- Assign a signature to specific people, org units, or rule-based audiences
## Workflow: fill data gaps
1. `list_teammates` to read emails and current smart-field values.
2. `update_teammate` to set the missing values.
## Workflow: target a signature
- `set_signature_recipient_rules` for auto-assign and smart-field conditions
- `add_signature_recipients` for specific emails
- `add_signature_recipient_entities` for directory org units and groups
## Tool reference
Access key: Read runs automatically, Write asks for confirmation, Delete is
destructive.
| Tool | Access | What it does |
| --- | --- | --- |
| `list_teammates` | Read | List teammates with emails and smart-field values |
| `create_teammate` | Write | Add a teammate from an email and optional values |
| `update_teammate` | Write | Set a teammate's smart-field values |
| `delete_teammate` | Delete | Soft-delete a teammate |
| `list_emails` | Read | List teammate emails (primary and aliases) |
| `create_email` | Write | Add an alias email to a teammate |
| `update_email` | Write | Change an email address |
| `delete_email` | Delete | Soft-delete an alias email (primary cannot be deleted) |
| `list_smart_fields` | Read | List smart-field definitions with kind and source |
| `create_smart_field` | Write | Define a custom field, optionally integration-synced |
| `update_smart_field` | Write | Update a custom field or its integration link |
| `delete_smart_field` | Delete | Delete a custom field and its values everywhere |
| `list_signature_recipients` | Read | List who a signature is assigned to, with rules |
| `add_signature_recipients` | Write | Assign a signature to a batch of emails |
| `remove_signature_recipients` | Write | Remove manually assigned recipients |
| `set_signature_recipient_rules` | Write | Set auto-assign and condition rules |
| `add_signature_recipient_entities` | Write | Target directory org units or groups |
| `remove_signature_recipient_entities` | Write | Untarget org units or groups |
## Notes
- When a directory integration (Google Workspace, Microsoft Entra ID or Zoho
Mail) manages the team list, creating or deleting teammates and emails returns
a 409.
- Default and integration-synced fields are read-only. Setting them is skipped
or returns a 422.
```
```markdown theme={null}
---
name: scribe-campaigns
description: >-
Plan, launch, schedule, and report on Scribe banner campaigns that run inside
email signatures. Use when the user wants to create, schedule, pause, resume,
update, or review a marketing campaign.
---
# Scribe campaigns
Run banner campaigns inside your team's signatures.
## When to use
- Create and schedule a banner campaign with a time window
- Pause, resume, or update a running campaign
- Review campaign status and targeting
## Workflow
1. For banner content, call `get_content_schema` before any content write.
2. `create_marketing_campaign` with a name and time window.
3. `schedule_marketing_campaign` to activate it.
## Tool reference
Access key: Read runs automatically, Write asks for confirmation, Delete is
destructive.
| Tool | Access | What it does |
| --- | --- | --- |
| `list_marketing_campaigns` | Read | List campaigns with status, targeting, and content |
| `create_marketing_campaign` | Write | Create a campaign draft with a name and time window |
| `update_marketing_campaign` | Write | Update a campaign by id |
| `schedule_marketing_campaign` | Write | Activate or schedule a draft or paused campaign |
| `pause_marketing_campaign` | Write | Pause an active campaign |
| `resume_marketing_campaign` | Write | Resume a paused campaign |
| `delete_marketing_campaign` | Delete | Delete a campaign (an active one stops first) |
## Notes
- Reporting on a campaign uses the analytics tools. The analytics tools accept a
`marketing_campaign_id` filter, so you can pull views, clicks, and conversions
for one campaign. See the analytics skill.
```
```markdown theme={null}
---
name: scribe-analytics
description: >-
Pull Scribe signature analytics, conversions, and visitor data. Use when the
user wants views, clicks, clickthrough rate, conversion or revenue numbers, a
time series, a ranking of signatures, teammates, campaigns, or countries, or a
look at identified visitors and where they came from.
---
# Scribe analytics and visitors
Report on signature performance, conversions, and the visitors signatures bring
in.
## When to use
- Show views and clicks over a date range, with totals and a time series
- Rank a dimension by views or clicks, or compute clickthrough rate
- Report conversions and revenue from recorded events
- Inspect the raw events behind the numbers
- Look up identified visitors and rank which signature or teammate acquired them
## Engagement
- `get_analytics_views` and `get_analytics_clicks` return a time series by
default. Set `group_by` (signature_template, marketing_campaign, teammate,
anchor, or country) for a ranked breakdown instead.
- There is no clickthrough-rate field. Pull both views and clicks and compute
clicks divided by views.
- Filter with `start_date`, `end_date`, and any of `signature_template_id`,
`marketing_campaign_id`, `teammate_id`.
## Conversions and revenue
- `get_analytics_events_summary` returns conversion count and summed value, as a
time series or a `group_by` breakdown (name, signature_template,
marketing_campaign, teammate, country, currency, or user). Pass a `currency`
for a clean revenue total.
- `list_analytics_events` returns the raw recorded events for verification or
export.
- Conversions come from the user's own website through the Scribe JavaScript SDK
(`@scribemail/js`), recorded with `scribe.track(...)` and keyed by the
workspace Event Tracking ID. If there are no conversions yet, the SDK is
probably not installed. You can offer to add it for the user: the snippet and a
`scribe.track('signup', { value, currency })` call on their signup or checkout
page, then point them to the Conversion tracking guide in the Scribe docs.
## Visitors
Visitors are the workspace's own identified end-users (from `identify` calls),
not Scribe teammates.
- `list_visitors` lists them, filterable by trait, acquisition channel, and
first-seen date.
- `get_visitor` returns one visitor with traits, first-touch attribution, and
lifetime engagement.
- `get_visitor_breakdown` ranks which signature or teammate acquired the most
visitors.
## Tool reference
All analytics and visitor tools are Read and run without confirmation.
| Tool | Access | What it does |
| --- | --- | --- |
| `get_analytics_views` | Read | Signature views over a date range, as a time series or a ranked breakdown |
| `get_analytics_clicks` | Read | Signature clicks over a date range, as a time series or a ranked breakdown |
| `get_analytics_events_summary` | Read | Aggregated conversion and revenue numbers, as a time series or a ranked breakdown |
| `list_analytics_events` | Read | List the raw recorded conversion events behind the analytics |
| `list_visitors` | Read | List identified visitors with traits and first-touch attribution |
| `get_visitor` | Read | Get one identified visitor with traits, attribution, and lifetime engagement |
| `get_visitor_breakdown` | Read | Rank which signature or teammate acquired the most identified visitors |
## Notes
- Date ranges default to the last two months. `hour` granularity is capped at a
31-day range.
- Breakdowns, events, and visitor lists are paginated with `page` and `limit`
(1 to 100).
```
For the full list of tools your assistant can call, see the [Scribe MCP tools reference](/en/ai-agents/tools).
# Scribe MCP tools reference
Source: https://help.scribe-mail.com/en/ai-agents/tools
Every tool the Scribe MCP server exposes to your AI assistant, grouped by area, with read, write, and delete access marked.
These are the tools your AI assistant can call once you connect the Scribe MCP server. The server exposes 57 tools across 15 areas. To connect an assistant, see the [AI agents overview](/en/ai-agents).
**How access works**
Read tools run automatically and never change your data. Write tools (create, update, publish, and similar) ask you to confirm first. Delete tools also ask you to confirm and are destructive. Every action is scoped to your own workspace.
## Schema
| Tool | Access | What it does |
| - | - | - |
| `get_content_schema` | Read | Returns the signature block-tree schema, all enum values, and a worked example. Call before authoring content |
## Signatures
| Tool | Access | What it does |
| - | - | - |
| `list_signatures` | Read | List signature templates (block trees omitted unless you pass `include_content`) |
| `create_signature` | Write | Create a template, staged as `draft_content` until you publish |
| `update_signature` | Write | Update a template by id, staged as a draft until you publish |
| `preview_signature` | Read | Render a draft or published template to HTML with placeholder values to check layout |
| `get_signature_html` | Read | Get the real installed HTML of a published signature for a specific recipient |
| `publish_signature` | Write | Publish a template so the draft becomes live and installs |
| `install_signature` | Write | Install the current live content without publishing |
| `delete_signature` | Delete | Delete a template and unassign it from teammates |
## Signature variants
A variant is an alternate signature shown on reply emails or on internal (same-domain) emails. Variants require an active Microsoft 365 signatures integration; without it, variant writes return a 409 `variants_unavailable`.
| Tool | Access | What it does |
| - | - | - |
| `list_signature_variants` | Read | List a signature's reply and internal variants with their state and content |
| `update_signature_variant` | Write | Create or update a reply or internal variant, staged as a draft until you publish |
| `publish_signature_variant` | Write | Publish a variant so its draft becomes live and redeploys |
| `delete_signature_variant` | Delete | Reset a variant back to the primary signature (the record is kept) |
## Signature recipients
| Tool | Access | What it does |
| - | - | - |
| `list_signature_recipients` | Read | List who a signature is assigned to, with the targeting rules |
| `add_signature_recipients` | Write | Assign a signature to a batch of teammate emails |
| `remove_signature_recipients` | Write | Remove manually assigned recipients from a signature |
| `set_signature_recipient_rules` | Write | Set auto-assign and the smart-field condition rules |
| `add_signature_recipient_entities` | Write | Target a signature at directory org units or groups |
| `remove_signature_recipient_entities` | Write | Untarget directory org units or groups |
## Teammates
| Tool | Access | What it does |
| - | - | - |
| `list_teammates` | Read | List teammates with their emails and smart-field values |
| `create_teammate` | Write | Add a teammate from an email and optional field values |
| `update_teammate` | Write | Set a teammate's smart-field values |
| `delete_teammate` | Delete | Soft-delete a teammate |
## Emails
| Tool | Access | What it does |
| - | - | - |
| `list_emails` | Read | List teammate emails (primary and aliases) |
| `create_email` | Write | Add an alias email to a teammate |
| `update_email` | Write | Change an email address |
| `delete_email` | Delete | Soft-delete an alias email (a primary email cannot be deleted) |
## Smart fields
| Tool | Access | What it does |
| - | - | - |
| `list_smart_fields` | Read | List smart-field definitions with kind and data source |
| `create_smart_field` | Write | Define a custom field, optionally synced from an integration |
| `update_smart_field` | Write | Update a custom field or its integration link |
| `delete_smart_field` | Delete | Delete a custom field and its values on every teammate |
## Folders
| Tool | Access | What it does |
| - | - | - |
| `list_folders` | Read | List signature folders with their signature counts |
| `create_folder` | Write | Create a folder to organize templates |
| `update_folder` | Write | Rename a folder |
| `delete_folder` | Delete | Delete a folder (it must be empty first) |
## Assets
| Tool | Access | What it does |
| - | - | - |
| `list_assets` | Read | List the image library (logos, banners, pictures) |
| `create_asset` | Write | Upload an image from base64 or a source URL |
| `update_asset` | Write | Update an asset's name or role |
| `delete_asset` | Delete | Delete an asset (in-use assets are soft-deleted so they keep rendering) |
## Integrations
| Tool | Access | What it does |
| - | - | - |
| `list_integrations` | Read | List active integrations with status and any error details |
| `list_integration_entities` | Read | List directory org units and groups to target a signature at |
## Financial documents
| Tool | Access | What it does |
| - | - | - |
| `list_financial_documents` | Read | List invoices and credit notes with downloadable PDF links |
## Workspace
| Tool | Access | What it does |
| - | - | - |
| `get_workspace` | Read | Read the workspace plan, status, and invoiced seat count |
## Analytics
There is no clickthrough-rate field. Pair `get_analytics_views` with `get_analytics_clicks` and compute clicks divided by views.
| Tool | Access | What it does |
| - | - | - |
| `get_analytics_views` | Read | Signature views over a date range, as a time series or a ranked breakdown |
| `get_analytics_clicks` | Read | Signature clicks over a date range, as a time series or a ranked breakdown |
| `get_analytics_events_summary` | Read | Aggregated conversion and revenue numbers, as a time series or a ranked breakdown |
| `list_analytics_events` | Read | List the raw recorded conversion events behind the analytics |
## Visitors
Visitors are the workspace's own identified end-users (from `identify` calls), not Scribe teammates.
| Tool | Access | What it does |
| - | - | - |
| `list_visitors` | Read | List identified visitors with traits and first-touch attribution |
| `get_visitor` | Read | Get one identified visitor with traits, attribution, and lifetime engagement |
| `get_visitor_breakdown` | Read | Rank which signature or teammate acquired the most identified visitors |
## Marketing campaigns
| Tool | Access | What it does |
| - | - | - |
| `list_marketing_campaigns` | Read | List campaigns with status, targeting, and content |
| `create_marketing_campaign` | Write | Create a campaign draft with a name and time window |
| `update_marketing_campaign` | Write | Update a campaign by id |
| `schedule_marketing_campaign` | Write | Activate or schedule a draft or paused campaign |
| `pause_marketing_campaign` | Write | Pause an active campaign |
| `resume_marketing_campaign` | Write | Resume a paused campaign |
| `delete_marketing_campaign` | Delete | Delete a campaign (an active one stops first) |
## Connect your assistant
Ready to connect? Follow the per-assistant steps on the [AI agents overview](/en/ai-agents).
# Troubleshoot the Scribe MCP connection
Source: https://help.scribe-mail.com/en/ai-agents/troubleshooting
Fix common Scribe MCP issues: tools not showing after connecting, and re-authenticating when your session expires.
If your assistant cannot see or run Scribe tools, work through the checks below. For what the connection can access and whether your data is safe, see the [FAQ](/en/ai-agents/faq).
Confirm the connector is enabled and that you finished the Scribe sign-in. In Claude, the tools appear in the chat composer's tool menu. If the sign-in did not complete, remove the connector and add it again. If you added Scribe by URL, check that your plan allows custom connectors, since some assistants gate them behind paid or developer settings. Installing from the Claude directory or the ChatGPT plugin store needs no such setting.
Sessions expire for security. If actions start returning an authentication error, open your assistant's connector settings and sign in to Scribe again. Re-authenticating restores access without changing anything in your workspace.
## Still stuck?
Re-check the setup steps for your assistant
Access, data safety, supported assistants
# Analytics Dashboard
Source: https://help.scribe-mail.com/en/analytics-dashboard
Read your email signature performance across every tab: track views, clicks, and click-through rate by campaign, signature, teammate, and country.
This guide walks you through each tab of the Analytics dashboard and explains how to read and drill into your data.
To measure what happens after a click, the signups and purchases on your own website, see [Conversion tracking](/en/conversion-tracking).
## Overview tab
The Overview tab is the default view when you open Analytics. It provides a summary of all signature activity across your workspace.
At the top, four metric cards show your aggregate numbers: **total views**, **total reach (unique users)**, **total clicks**, and **average CTR**. See [Analytics Overview](/en/analytics-overview#what-analytics-tracks) for what each metric means.
Below the metrics, a timeline chart plots signature activity over your selected date range. Use the **Day**, **Week**, or **Month** toggles to change the chart grouping. Hover over any data point to see the exact value for that period.
Use the date range picker in the top right corner to adjust the time window.
Scroll down to see three leaderboard tables: **Top 5 elements**, **Top 5 teammates**, and **Top 5 countries**. These highlight your best performers at a glance.
## Marketing Campaigns tab
The Marketing Campaigns tab lists all your campaigns with their performance data. Each row shows:
| Column | Description |
| - | - |
| Preview | A thumbnail preview of the marketing element |
| Name | Campaign name |
| Signature | The targeted signature(s), with a count if multiple |
| From | Campaign start date |
| To | Campaign end date |
| Views | Total signature views during the campaign |
| Clicks | Total clicks on the marketing element |
| CTR | Click-through rate |
| Status | Active or Inactive |
| Actions | Click the arrow to open the campaign detail page |
## Signatures tab
The Signatures tab shows aggregated performance for each signature template. Each row displays:
| Column | Description |
| - | - |
| Signature | Signature template name |
| Views | Total views across all teammates using this signature |
| Clicks | Total clicks on elements in this signature |
| CTR | Click-through rate |
| Actions | Click the arrow to open the signature detail page |
### Signature detail page
Click the arrow on any signature row to open its detail page. This page shows:
* **Signature preview.** A live rendering of the signature on the left side.
* **Conversion Rate.** The same four metric cards (total views, total reach, total clicks, average CTR) scoped to this specific signature.
* **Timeline chart.** A chart plotting activity over time for this signature, with Day/Week/Month toggles.
* **Top 5 elements.** A table of the best-performing elements within this signature, showing preview, element type, link, views, clicks, CTR, status, and lifetime.
## Teammates tab
The Teammates tab shows individual performance for each teammate. A search bar and **Filter** button at the top let you find specific teammates quickly.
Each row shows:
| Column | Description |
| - | - |
| Teammate | Name and job title |
| Signature | The signature template assigned to them |
| Views | Total views generated by this teammate's signature |
| Clicks | Total clicks on their signature elements |
| CTR | Click-through rate |
### Teammate detail page
Click on a teammate to open their individual detail page. This page shows:
* **Overview metrics.** Total views, total reach (unique users), total clicks, and average CTR for this teammate.
* **Timeline chart.** Activity over time with Day/Week/Month toggles and a date range picker.
* **Top 5 elements.** A table of the best-performing elements in this teammate's signature, showing preview, element type, link, signature, views, clicks, CTR, status, and lifetime.
## Countries tab
The Countries tab provides a geographic breakdown of signature engagement. Each row shows:
| Column | Description |
| - | - |
| Countries | Country name with flag |
| Views | Total signature views from recipients in this country |
| Clicks | Total clicks from recipients in this country |
| CTR | Click-through rate for this country |
This helps you understand where your emails are making the most impact and tailor campaigns to specific regions.
# Analytics Overview
Source: https://help.scribe-mail.com/en/analytics-overview
Track the performance of your email signatures with views, clicks, and CTR across signatures, teammates, campaigns, and countries.
Analytics gives you a complete picture of how your email signatures are performing. See how many people are viewing your signatures, clicking on elements, and engaging with your [marketing campaigns](/en/marketing-overview), all from one centralized dashboard.
## What Analytics tracks
Every time a teammate sends an email with a Scribe signature, the signature elements are tracked automatically. Analytics collects four core metrics across your entire workspace:
* **Total views.** The number of times signatures were displayed to email recipients.
* **Total reach (unique users).** The number of unique recipients who saw a signature.
* **Total clicks.** The number of times recipients clicked on a signature element (link, button, banner, etc.).
* **Average CTR.** The overall click-through rate as a percentage.
These metrics are shown at the top of the Overview tab and update in real time.
Beyond views and clicks, you can also track **conversions**: the signups, demos, and purchases that happen on your website after someone clicks a signature. See [Conversion tracking](/en/conversion-tracking) to set it up with the Scribe JavaScript SDK and tie real revenue back to your signatures.
## Analytics tabs
The Analytics page is organized into five tabs, each offering a different lens on your data:
* **Overview.** A high-level summary of all signature performance with a timeline chart and leaderboards for top elements, top teammates, and top countries.
* **Marketing Campaigns.** Performance data for each [marketing campaign](/en/marketing-campaign), including views, clicks, CTR, date range, and status.
* **Signatures.** Aggregated performance per signature template, so you can compare how different signatures perform.
* **Teammates.** Individual performance per teammate, showing who is generating the most views and clicks.
* **Countries.** Geographic breakdown of signature engagement by country.
## Date range and grouping
A date range picker in the top right corner lets you filter analytics to a specific period. You can also toggle the timeline chart between **Day**, **Week**, and **Month** groupings to zoom in or out on trends.
## Top performers
The Overview tab includes three leaderboard tables that surface your best-performing items at a glance:
* **Top 5 elements.** The signature elements (links, buttons, banners) with the most engagement. Each row shows a preview, element type, link, associated signature, views, clicks, CTR, status, and lifetime.
* **Top 5 teammates.** The teammates generating the most signature engagement, with their signature, views, clicks, and CTR.
* **Top 5 countries.** The countries where recipients are engaging most, shown with a flag, views, clicks, and CTR.
## Related articles
* [Analytics dashboard](/en/analytics-dashboard): a closer look at the dashboard tabs and metrics.
* [Conversion tracking](/en/conversion-tracking): record website signups and purchases and attribute them to your signatures.
* [Signature analytics](/en/signature-analytics): performance for an individual signature.
* [Marketing campaigns](/en/marketing-overview): run and measure campaign banners across the team.
# Billing
Source: https://help.scribe-mail.com/en/billing
Manage your Scribe subscription, payment method, billing address, invoices, tax information, and credits from the Billing settings page.
The Billing page is where you manage everything related to your Scribe subscription: your [plan](/en/plans), payment method, billing address, tax information, and invoices.
To access it, go to **Configuration → Billing** in the left sidebar.
## Subscription overview
At the top of the Billing page, you'll see a summary of your current subscription status.
During the free trial, this shows how many days remain and confirms you have access to unlimited users, unlimited signatures, and all Scribe features.
Below the summary, you can view and edit the following fields:
| Field | Description |
| - | - |
| **Plan** | Your current plan (Free trial, Business, or Enterprise). Click **Edit** to change your plan. |
| **Payment method** | The card on file for automatic payments. Click **Edit** to add or update your payment method. |
| **Billing emails** | Email addresses that receive invoices and billing notifications. Click **Edit** to update. |
| **Your address** | Your company billing address used on invoices. Click **Edit** to update. |
| **Tax id** | Your company tax identification number (VAT, GST, etc.) for invoices. Click **Edit** to update. |
| **Credits** | Any account credits available. Credits are applied automatically to your next invoice. Click **Add** to purchase credits. |
## Update billing address
Click **Edit** next to **Your address** or **Billing emails** to open the billing address form.
The form includes:
**Information**
* **Company Name**: Your legal company name as it should appear on invoices.
* **Billing emails**: Email addresses that receive invoices and payment notifications. You can add up to 10 email addresses, separated by commas.
* **Tax IDs**: Your company tax identification number (VAT number, GST, etc.).
**Address**
* Street, house number, apartment/suite, postal code, city, and country.
Click **Update** to save your changes. Your updated billing details will appear on all future invoices.
Your billing address and tax ID are used to generate compliant invoices. Make sure they match your company's official registration details.
***
## Invoices
The bottom of the Billing page shows your full invoice history in a table.
Each invoice row includes:
| Column | Description |
| - | - |
| **Date** | The date the invoice was issued. |
| **Amount** | The total amount charged. |
| **Invoice Type** | The type of charge. See [Invoice types](#invoice-types) below. |
| **Users** | The number of paid users on this invoice. A paid user is a teammate whose primary email is [assigned to a Scribe signature](/en/assign-teammates-to-a-signature). Alias emails are free of charge. |
| **Plan** | The plan associated with this invoice (Business or Enterprise). |
| **Interval** | Monthly or Yearly billing cycle. |
| **Status** | The payment status. See [Invoice statuses](#invoice-statuses) below. |
| **Payment Retry** | Shows the retry count (e.g. 6/9) if a payment has failed. Hover to see the next retry date. |
| **Actions** | Download, view details, or retry payment. |
### Invoice types
| Type | Description |
| - | - |
| **Initial** | Your first invoice when starting a new subscription or upgrading to a higher plan. Includes the base plan cost and any additional users. |
| **Renewal** | Regular recurring invoice for your subscription. Charged monthly or annually based on your billing cycle, plus any additional users added since the last invoice. |
| **Additional users** | Additional users added to your subscription are billed on top of your current plan. New users are prorated based on your billing cycle. |
| **Credit note** | A credit manually applied to your account by the Scribe team for billing adjustments, refunds, or other account-specific reasons. |
### Invoice statuses
| Status | Description |
| - | - |
| **Paid** | Payment was successfully processed. The tooltip shows the exact date, time, and card used. |
| **Payment Failed** | The payment attempt was unsuccessful. Common reasons include insufficient funds or an expired card. Scribe will automatically retry the payment. See [Failed payments](#failed-payments) below. |
| **Cancelled** | After 9 failed payment attempts, Stripe automatically cancels your subscription. You'll need to activate a new subscription to keep your signatures running. |
### Invoice actions
Each invoice row has action buttons on the right:
* **Download**: Download the invoice PDF or receipt PDF.
* **View invoice details**: Opens a detailed breakdown of the invoice showing the subscription summary, user adjustments, taxes, and total.
* **Retry payment**: Manually retry a failed payment (only appears on failed invoices).
***
## View invoice details
Click the **eye icon** on any invoice row to open the Invoice Details or Upcoming Invoice modal.
The modal shows:
* **Subscription summary**: Your plan name, billing interval, number of users, per-user price, and the calculation formula (e.g. \$3.0 × 235 users × 12 months).
* **User adjustments**: Any users added or removed during the billing period, with prorated charges and credits.
* **Subtotal (excl. tax)**: The total before tax.
* **Tax**: VAT or other applicable taxes based on your billing address.
* **Total**: The final amount charged.
* **Renewal date**: When your plan will automatically renew.
* **Stripe Climate**: Scribe contributes 1% of your subscription to [remove CO₂ from the atmosphere](/en/climate) through Stripe Climate.
If you see "User adjustment for current period" on an upcoming invoice, this is a prorated credit or charge for users added or removed mid-cycle.
***
## Failed payments
When a payment fails, Scribe automatically retries the charge through Stripe. The **Payment Retry** column shows the current attempt count out of the maximum 9 attempts (e.g. 6/9).
Hover over the retry count to see the date of the next automatic retry.
After 9 failed attempts, Stripe automatically cancels your subscription and your signatures will be deactivated. To restore service, click **Activate new subscription** on the cancelled invoice row.
### Retry a payment manually
If you've updated your card or resolved the issue, you don't have to wait for the next automatic retry.
Go to **Configuration → Billing** and locate the invoice with a **Payment Failed** status.
Click the **retry** icon (circular arrow) in the Actions column.
A confirmation dialog will show the card that will be charged, the invoice date, and the amount. Click **Retry payment** to proceed.
***
## Credits
Credits are prepaid amounts that get applied automatically to your next invoice. Your current credit balance is displayed on the Billing page.
Credits can be added by clicking **Add** next to the Credits field, or may be applied by the Scribe team for billing adjustments or account-specific reasons.
## Related articles
* [Pricing](/en/pricing): how per-user pricing, proration, and the free trial work.
* [Plans](/en/plans): compare the Free, Business, and Enterprise tiers feature by feature.
* [Plan limits and changes](/en/plan-limits-and-changes): what happens when your team size or plan changes.
# Configure your sending domain
Source: https://help.scribe-mail.com/en/configure-your-sending-domain
Set up a custom sending domain in Scribe so signature links use your own company domain: add two CNAME records, then verify them once DNS propagates.
This guide walks you through configuring a custom sending domain so all your signature URLs use your own company domain instead of Scribe's default (sendassets.io).
Not sure why this matters? Read [Why configure a sending domain?](/en/why-configure-a-sending-domain) first.
## Set up your sending domain
Go to **Configuration → DNS** in the left sidebar.
If you've already synced your email provider (Google Workspace, Microsoft 365 or Zoho Mail) with Scribe, your domain will appear automatically. Click **Configure** to proceed.
If your domain isn't listed, click **Add a domain** and enter your company domain (e.g. `mycompany.com`).
Pick a prefix for your sending domain. This will be combined with your company domain to create the full sending domain.
For example, if you enter `signature` and your domain is `mycompany.com`, your sending domain will be `signature.mycompany.com`.
Common prefix choices:
* `signature`
* `email-signature`
* `sig`
* `mail`
Scribe will display **two CNAME records** that you need to add in your domain provider's DNS settings.
| Record type | Host Name | Required Value |
| - | - | - |
| CNAME | Your chosen prefix (e.g. `email-signature`) | `custom-hostname-ass...` (provided by Scribe) |
| CNAME | `_acm...` (provided by Scribe) | `email-signature.scribe-...` (provided by Scribe) |
Use the **Copy** button next to each value to copy it exactly.
You have two options to configure them:
**Option A: Automatic setup (recommended)**
Follow Scribe's setup wizard to automatically configure the DNS records in your domain provider. No developer needed. Scribe handles the configuration for you.
**Option B: Manual setup**
If automatic setup isn't available for your provider, you'll see the two CNAME records with copy buttons. Manually add both records in your domain provider's DNS management panel (e.g. GoDaddy, Cloudflare, Google Domains, OVH, Namecheap, etc.).
Once you've added both records, click **I have copied 2/2 records** to proceed.
**Need help?** Click **Forward instructions to a colleague** to generate a shareable link. Send this link to your IT team or whoever manages your domain, and they'll be able to complete the DNS setup without needing access to Scribe.
DNS propagation can take up to 48 hours. Once the DNS records have propagated, the status in Scribe will automatically change to **Validated**.
You can check the propagation status at any time:
* In your Scribe DNS settings page
* Using an external tool like [DNS Checker](https://dnschecker.org/#CNAME/)
Once validated, all signature URLs across your workspace will automatically use your custom sending domain instead of sendassets.io. No need to update individual signatures.
**Cloudflare users**: If your domain is managed through Cloudflare, make sure to:
* Set the Proxy Status to **DNS only** (gray cloud icon, not orange).
* **Disable CNAME flattening** in your Cloudflare DNS settings.
Failing to do so will prevent Scribe from verifying your sending domain.
***
## Frequently asked questions
You can use any subdomain you like, as long as it's not already in use. We recommend something descriptive like `signature.your-company.com` or `email-signature.your-company.com`. Avoid using your root domain (e.g. `your-company.com`). Always use a subdomain.
DNS changes typically propagate within a few minutes to a few hours, but in rare cases it can take up to 48 hours. If verification hasn't completed after 48 hours, double-check that both CNAME records are correctly configured.
Yes. You can update your sending domain at any time from the DNS settings page. You'll need to add new DNS records and verify them. All signature URLs will automatically switch to the new domain once validated.
Yes. During setup, click **Forward instructions to a colleague** to generate a shareable link. Send this link to your IT team or domain administrator, and they'll see the exact records to add without needing a Scribe account.
No. The sending domain is used for signature asset URLs and tracking links, not for email authentication. DKIM and SPF are separate configurations managed through your email provider. Scribe also offers DKIM signing for marketing banners. See the [Plans comparison](/en/plans) for availability.
# Conversion tracking
Source: https://help.scribe-mail.com/en/conversion-tracking
Track website signups, demos, and purchases with the Scribe JavaScript SDK and attribute every conversion back to the email signature that drove it.
Conversion tracking closes the loop on your email signatures. Signature analytics already shows you views and clicks. With the Scribe JavaScript SDK, you can also record what happens next on your own website, the signups, demos booked, and purchases, and tie each one back to the signature, teammate, and link that drove it. This is the bottom of the funnel: views, then clicks, then conversions.
In Scribe these conversions are called **events**. You record them with a few lines of JavaScript, and Scribe attributes them automatically using the same click tracking that powers the rest of your analytics.
Conversion tracking is available on paid plans. If your workspace plan does not include it, the tracking snippet records nothing.
## Ask an AI agent to set it up
You do not have to wire this up by hand. If you use an AI coding assistant (such as Claude Code, Cursor, or a similar agent in your editor), paste it a prompt like this, with your own Event Tracking ID and the conversions you care about:
```text theme={null}
Install the Scribe conversion tracking SDK on my website.
- If this is an app or single-page app, add the @scribemail/js package and call
scribe.init({ id: 'YOUR_EVENT_TRACKING_ID' }) once at startup. If it is a plain
HTML site, add the https://cdn-1.scribe-mail.com/v1/tracking.js script with
data-workspace="YOUR_EVENT_TRACKING_ID" before instead.
- Call scribe.track('signup', { value, currency }) from my signup success handler
and scribe.track('purchase', { value, currency }) from my checkout confirmation.
- If I have logged-in users, call scribe.identify(userId, { email, plan }) after login.
- Add https://cdn-1.scribe-mail.com and https://t.scribe-mail.com to my Content
Security Policy if I have one.
```
Once conversions are flowing, an agent connected to the [Scribe MCP server](/en/ai-agents/connect) can read and explain the results for you. Ask it things like "which signatures and teammates drove the most conversions and revenue this month?" or "list the visitors my signatures acquired this week." See [Scribe for AI agents](/en/ai-agents) and the [Scribe analytics skill](/en/ai-agents/skills) for what your assistant can pull.
## How it works
1. A recipient clicks a link in one of your email signatures.
2. Scribe redirects them to your site and adds a `scribe_click_id` parameter to the destination URL.
3. The Scribe SDK on your landing page reads that `scribe_click_id`, stores it first-party, and attaches it to every event you record.
4. When the visitor converts, you call `scribe.track('signup')`. Scribe joins the event back to the originating click.
The result: you can see which signatures, teammates, and clicked elements produce real conversions and revenue, not just clicks. Attribution works at the sender, signature, and element level, and Scribe matches a conversion to a click for up to 30 days after the click.
Scribe only stores conversions it can tie back to a signature click. An event carries that link in one of two ways: the `scribe_click_id` the SDK captured from the landing URL, or a visitor you have already identified (a previous `scribe.identify` or attributed event links that visitor to their original click). An event with neither, so genuinely direct traffic, an expired link, or a stripped parameter, is not recorded. This keeps your conversion analytics limited to the traffic your signatures actually drove.
## Before you start
You need three things:
* **A paid plan** that includes conversion tracking.
* **Tracking enabled** for your workspace. This is the same setting that powers signature view and click analytics. Turn it on only once you have the consent you need (see [Privacy and consent](#privacy-and-consent)).
* **Your Event Tracking ID.** This is a public, non-secret identifier for your workspace. It is safe to embed in your website HTML.
In Scribe, open **Settings**, go to the **Workspace** tab, and copy the value under **Event Tracking ID**. While you are there, make sure **Tracking** is enabled.
Use the script snippet for a plain website, or the npm package for an app or single-page app. Both expose the same `scribe.track(...)` API.
**Option A. Script snippet.** Add this to every page you want to track, right before the closing `` tag. The snippet auto-initializes from `data-workspace`, so there is no `init()` call to make.
```html theme={null}
```
**Option B. npm or yarn.** Install the package, then initialize it once at app startup.
```bash theme={null}
npm install @scribemail/js
# or: yarn add @scribemail/js
```
```js theme={null}
import scribe from '@scribemail/js';
scribe.init({ id: 'YOUR_EVENT_TRACKING_ID' }); // once, at app startup
```
Importing the module has no side effects (it is safe for server-side rendering). Nothing is sent until you call `init()`.
Call `scribe.track` wherever a conversion happens, for example in your signup success handler.
```js theme={null}
// Signup
scribe.track('signup', { value: 99.0, currency: 'USD', plan: 'pro' });
// Demo booked
scribe.track('demo_booked');
// Purchase
scribe.track('purchase', { value: 149.0, currency: 'USD', event_id: 'order_1042' });
// Subscription started
scribe.track('subscribe', { value: 29.0, currency: 'USD', plan: 'monthly' });
```
The SDK captures the Scribe click attribution from the landing URL for you, batches your events, and sends them reliably, including when the visitor navigates away.
Test it the way a real visitor arrives: **click a link in one of your own signature emails**, let Scribe redirect you to your site (the destination URL now carries a `scribe_click_id`), then trigger the conversion on that page. Open **Analytics** in Scribe and it appears alongside views and clicks, broken down by signature, teammate, campaign, and country.
Loading your site directly and firing an event will show nothing. With no `scribe_click_id` on the visit, Scribe has no click to attribute the conversion to and does not record it. Always start your test from a real signature link.
## SDK reference
### `scribe.track(name, metadata)`
Records an event. `name` is required, for example `signup`, `demo_booked`, or `purchase`.
```js theme={null}
scribe.track('purchase', {
value: 149.0, // optional, monetary value of the conversion
currency: 'EUR', // optional, ISO currency code
event_id: 'order_8821', // optional, your own id, used for idempotency
plan: 'team', // any other key becomes an event "property"
seats: 5
});
```
* `value`, `currency`, and `event_id` are recognized top-level fields.
* **Every other key** becomes part of the event's `properties`. Keep properties to flat scalar values (strings, numbers, booleans). Do not put personal data such as emails or phone numbers in properties: Scribe drops keys that look like personal data automatically.
* Provide your own `event_id` to make a send safe to retry. The same `event_id` received twice within 24 hours is recorded only once.
### `scribe.identify(userId, traits)`
Associates the visitor with one of your own users, so you can see which signatures acquire which customers. Useful for B2B and account-based work.
```js theme={null}
scribe.identify('user_42', { email: 'ada@example.com', name: 'Ada', plan: 'pro' });
```
After an `identify` call, subsequent `track` calls are tied to that user. Call `scribe.reset()` on logout to clear the identity.
### `scribe.flush()`
Events are batched and sent automatically, and always on page hide. Call `flush()` only if you need to force the current batch out immediately.
### Snippet attributes
When you use the script snippet, configure it with `data-*` attributes:
| Attribute | Required | Description |
| - | - | - |
| `data-workspace` | Yes | Your Event Tracking ID. |
| `data-consent` | No | Set to `"denied"` to disable first-party storage until the visitor consents. |
| `data-cookie-domain` | No | Set your apex domain to share identity across subdomains. |
### Content Security Policy
If your site sets a Content Security Policy, allowlist the Scribe hosts:
```text theme={null}
script-src https://cdn-1.scribe-mail.com;
connect-src https://t.scribe-mail.com;
```
Need to record an authoritative event from your backend, such as a payment your server confirmed? Scribe also accepts events through the API with an `events:write` API key, which keeps revenue values trusted rather than client-supplied. See the [API Reference](/api-reference/introduction) for details.
## Use cases: turn conversions into growth
Conversion tracking turns your email signatures into a measurable acquisition channel. Here is how teams put the data to work, including feeding it into paid remarketing.
### Run remarketing campaigns on Google Ads and Meta Ads
Fire your ad-platform conversion pixels in the same place you call `scribe.track`, so a single conversion lands in Scribe, Google Ads, and Meta at once. Scribe tells you the conversion came from an email signature; Google and Meta use the same signal for bidding and audiences.
```js theme={null}
function onSignupComplete(plan, price) {
// 1. Attribute the conversion to the email signature that drove it
scribe.track('signup', { value: price, currency: 'USD', plan });
// 2. Send the same conversion to your ad platforms for bidding and audiences
// gtag('event', 'conversion', { send_to: 'AW-XXXXXXXXX/abc', value: price, currency: 'USD' });
// fbq('track', 'CompleteRegistration', { value: price, currency: 'USD' });
}
```
### Build high-intent retargeting audiences
People who clicked your signature and landed on your site, but did not convert, are warm. Use Scribe to confirm signature-driven traffic, then retarget those visitors with a tailored offer on Google and Meta. Because the traffic comes from your own emails, these audiences tend to convert better than cold prospecting.
### Seed lookalike and similar audiences from your converters
Your best seed audience is people who already converted through a trusted channel. Pull the visitors that signatures acquired (filter by signature, teammate, or campaign), upload them as a Custom Audience in Meta or a Customer Match list in Google Ads, and build Lookalike or Similar audiences from that high-quality seed.
### Suppress existing customers from acquisition spend
Stop paying to acquire people who already signed up or bought. Export your converters and add them as an exclusion or suppression list on your prospecting campaigns, so budget goes to net-new prospects.
### Optimize for revenue, not just clicks
Pass a real `value` and `currency` with each conversion. With revenue attached, you can switch Google and Meta to value-based bidding, and in Scribe you can rank signatures, teammates, and campaigns by the revenue they generate rather than by clicks alone.
### Prove the channel and reallocate budget
Conversion tracking lets you compare email-signature-driven revenue against your paid channels in the same terms. When a signature campaign outperforms a paid one, you have the numbers to shift budget toward what works.
## Privacy and consent
Conversion tracking is built to respect your visitors and your obligations:
* **IP addresses are anonymized.** Scribe hashes the IP before storing it. Raw IPs are never kept.
* **No personal data in properties.** Keys that look like personal data (email, phone, password, tokens, card numbers, and similar) are stripped from event properties automatically. Use `identify` when you deliberately want to associate a user.
* **Consent-gated storage.** Set `data-consent="denied"` (snippet) or `consent: false` (npm `init`) to keep the SDK from storing the click identifier until your visitor consents.
* **Get consent before enabling tracking.** The workspace tracking setting carries the same responsibility as any analytics pixel. Make sure you have the consent your region requires before you turn it on.
## Related articles
* [Analytics Overview](/en/analytics-overview): views, clicks, reach, and CTR across your workspace.
* [Analytics Dashboard](/en/analytics-dashboard): read conversions next to views and clicks in every tab.
* [Signature analytics](/en/signature-analytics): performance for an individual signature.
* [Marketing campaigns](/en/marketing-overview): run and measure banner campaigns inside signatures.
* [Personalize links with Smart Fields](/en/editor/personalize-links): send UTM parameters and teammate details to your own tools, a dataset separate from Scribe's tracking.
* [Scribe for AI agents](/en/ai-agents): let an assistant set up tracking and report on conversions.
# Signature HTML
Source: https://help.scribe-mail.com/en/integrations/signatures/signature-html
Copy your Scribe signature as HTML to install it manually on any email platform, or invite teammates to add and install their own signature themselves.
Follow these steps to copy your Scribe signature HTML to third-party platforms.
**Each user must manually install their signature HTML.**
**Users see signatures when composing emails.**
**Cloud-based installation.** Emails don't go through Scribe servers.
## Manual HTML installation
### Prerequisites
* A Scribe account
* At least one signature created in Scribe
* Teammates added to your workspace
Select your platform, then copy the HTML code to install it.
Find step-by-step instructions for your email platform:
Install your signature in Gmail
Install your signature in Outlook
## Invite teammates to install HTML
Instead of copying the HTML yourself, you can invite teammates to install their own signature. Invited teammates can only access their own signature to add information and install it. They won't have access to other parts of your Scribe workspace.
Invited teammates will only have access to their own signature to add information and install it. They won't have access to other parts of your Scribe workspace.
Invited teammates can be managed in your Scribe settings under the Members tab.
# Install HTML signature in Gmail
Source: https://help.scribe-mail.com/en/integrations/signatures/signature-html-gmail
Install your Scribe email signature in Gmail by pasting the HTML into Gmail settings and setting it as your default for new emails and replies.
Follow these steps to install your Scribe HTML signature in Gmail.
## Prerequisites
* Your Scribe signature HTML copied to clipboard ([copy it from here](/en/integrations/signatures/signature-html))
In Gmail, click the gear icon in the top right corner, then click **See all settings**.
In the **General** tab, scroll down until you find the **Signature** section.
Click **+ Create new** and give your signature a name (e.g. "Scribe").
Click inside the signature text box, then paste your Scribe HTML signature using **Ctrl+V** (Windows) or **Cmd+V** (Mac).
Make sure to paste in the signature text box, not in the name field. Gmail will automatically render the HTML as a formatted signature.
Below the signature editor, choose your new signature as the default for:
* **For new emails use:** select your Scribe signature
* **On reply/forward use:** select your Scribe signature
Scroll to the bottom of the page and click **Save Changes**.
# Install HTML signature in Outlook
Source: https://help.scribe-mail.com/en/integrations/signatures/signature-html-outlook
Install your Scribe email signature in Outlook on the web by pasting the HTML into settings and setting it as your default for new messages and replies.
Follow these steps to install your Scribe HTML signature in Outlook on the web.
These instructions are for **Outlook on the web** (outlook.office.com). For Outlook desktop on Windows or Mac, we recommend using the [Outlook Windows](/en/integrations/signatures/outlook-windows) or [Outlook Mac](/en/integrations/signatures/outlook-mac) integration instead.
## Prerequisites
* Your Scribe signature HTML copied to clipboard ([copy it from here](/en/integrations/signatures/signature-html))
In Outlook on the web, click the gear icon in the top right corner to open **Settings**.
In the settings panel, navigate to **Email**, then select **Compose and reply**.
Click inside the signature text box, then paste your Scribe HTML signature using **Ctrl+V** (Windows) or **Cmd+V** (Mac).
Make sure to paste in the signature editor area, not in the name field. Outlook will automatically render the HTML as a formatted signature.
At the bottom of the signature section, set your default signatures:
* **For new messages:** select your Scribe signature
* **For replies/forwards:** select your Scribe signature
Click **Save** to apply your new signature.
# Aircall
Source: https://help.scribe-mail.com/en/integrations/smart-fields/aircall-smart-fields
Keep email signatures accurate and up to date by syncing teammate details from Aircall, your cloud phone system, such as direct phone numbers.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Aircall as a data source.
**No action needed from your teammates.**
**Changes in your Aircall auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
### Prerequisites
* Admin access to your Aircall account
* A Scribe account with admin access
You must be an **Admin in Aircall** to install this integration.
Click **Connect Aircall** to start the integration.
If you are already logged in, this step will be skipped.
Scribe would like to access information about your calls. Click **Authorize** to grant access.
You can skip the numbers step. Click **Skip for now** to complete the integration.
## Related articles
* [Cloudtalk](/en/integrations/smart-fields/cloudtalk-smart-fields): sync Cloudtalk data into your signatures.
* [Dialpad](/en/integrations/smart-fields/dialpad-smart-fields): sync Dialpad data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# BambooHR
Source: https://help.scribe-mail.com/en/integrations/smart-fields/bamboohr-smart-fields
Keep email signatures accurate and automatically up to date by syncing employee details from BambooHR, your HR system, like name, job title, and custom fields.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using BambooHR as a data source.
**No action needed from your teammates.**
**Changes in your BambooHR auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/bamboohr).
## Installation guide
### Prerequisites
* A Scribe account with admin access
* A BambooHR account with API key access
Your subdomain is the part before `.bamboohr.com` in your BambooHR URL. Enter it in the **Subdomain** field in Scribe.
You can name the key anything you want (e.g. "Scribe"). It's just a way for you to keep track of your API keys.
The default BambooHR integration provides access to basic Smartfields such as first name, last name, etc.
If you need additional Smartfields, including custom fields you've created in BambooHR, you'll need to generate a custom report within BambooHR and enter the report ID into your Scribe integration.
The "work email" field must be included in the BambooHR report to ensure we can correctly match your BambooHR employees with your Scribe teammates.
Enter your report ID, then click **Connect BambooHR**.
## Related articles
* [Ceridian Dayforce](/en/integrations/smart-fields/ceridian-dayforce-smart-fields): sync Ceridian Dayforce data into your signatures.
* [ChartHop](/en/integrations/smart-fields/charthop-smart-fields): sync ChartHop data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Cal.com
Source: https://help.scribe-mail.com/en/integrations/smart-fields/calcom-smart-fields
Keep email signatures accurate and up to date by syncing teammate details from Cal.com, your scheduling tool, so booking links stay current.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Cal.com as a data source.
**No action needed from your teammates.**
**Changes in your Cal.com auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/calcom).
## Installation guide
### Prerequisites
* Admin or owner access to your Cal.com team or organization
* A Cal.com account on a Teams or Organizations plan
* A Scribe account with admin access
You must be an **Admin in Cal.com** to install this integration, and your Cal.com account must belong to a **team or organization**.
Click **Connect Cal.com** to start the integration.
If you are already logged in, this step will be skipped.
Once you authorize, the integration connects automatically. Click **Allow** to complete the integration.
## Related articles
* [Calendly](/en/integrations/smart-fields/calendly-smart-fields): sync Calendly data into your signatures.
* [Chili Piper](/en/integrations/smart-fields/chili-piper-smart-fields): sync Chili Piper data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Calendly
Source: https://help.scribe-mail.com/en/integrations/smart-fields/calendly-smart-fields
Keep email signatures accurate and up to date by syncing teammate details from Calendly, your scheduling tool, so meeting booking links stay current.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Calendly as a data source.
**No action needed from your teammates.**
**Changes in your Calendly auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/calendly).
## Installation guide
### Prerequisites
* Admin access to your Calendly account
* A Scribe account with admin access
You must be an **Admin in Calendly** to install this integration.
Click **Connect Calendly** to start the integration.
If you are already logged in, this step will be skipped.
Once you authorize, the integration connects automatically. Click **Connect to Calendly** to complete the integration.
## Related articles
* [Chili Piper](/en/integrations/smart-fields/chili-piper-smart-fields): sync Chili Piper data into your signatures.
* [Cal.com](/en/integrations/smart-fields/calcom-smart-fields): sync Cal.com data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Ceridian Dayforce
Source: https://help.scribe-mail.com/en/integrations/smart-fields/ceridian-dayforce-smart-fields
Keep email signatures accurate and up to date by syncing employee details from Ceridian Dayforce, your HR and payroll system, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Ceridian Dayforce as a data source.
**No action needed from your teammates.**
**Changes in your Dayforce auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/dayforce).
## Installation guide
### Prerequisites
* A Scribe account with admin access
* An **Admin** role in Dayforce
You must be an **Admin in Dayforce** to install this integration.
This integration requires activation by our team. Please [contact support](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a) to get started.
## Related articles
* [ChartHop](/en/integrations/smart-fields/charthop-smart-fields): sync ChartHop data into your signatures.
* [Deel](/en/integrations/smart-fields/deel-smart-fields): sync Deel data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# ChartHop
Source: https://help.scribe-mail.com/en/integrations/smart-fields/charthop-smart-fields
Keep email signatures accurate and up to date by syncing employee details from ChartHop, your HR and org-chart platform, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using ChartHop as a data source.
**No action needed from your teammates.**
**Changes in your ChartHop auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/charthop).
## Installation guide
### Prerequisites
* A Scribe account with admin access
* A ChartHop account with access to Apps & Bundles
In ChartHop, go to the **Settings** tab of the Scribe app. Copy the **API Token** and paste it into the API Token field in Scribe.
Your Org Nickname is the part right after `app.charthop.com/` in your ChartHop URL. Enter it in the **ChartHop Org Nickname** field in Scribe, then click **Connect ChartHop**.
## Related articles
* [Deel](/en/integrations/smart-fields/deel-smart-fields): sync Deel data into your signatures.
* [Gusto](/en/integrations/smart-fields/gusto-smart-fields): sync Gusto data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Chili Piper
Source: https://help.scribe-mail.com/en/integrations/smart-fields/chili-piper-smart-fields
Keep email signatures accurate and up to date by syncing teammate details from Chili Piper, your scheduling and lead-routing tool, so booking links stay right.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Chili Piper as a data source.
**No action is needed from your teammates.**
**Changes in your Chili Piper auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
### Prerequisites
* Admin access to your Chili Piper account
* A Scribe account with admin access
Find your subdomain in your Chili Piper URL. It's the part before `.chilipiper.com` (e.g. `scribe-mail` in `https://scribe-mail.chilipiper.com/fire/admin/onboarding`).
## Related articles
* [Cal.com](/en/integrations/smart-fields/calcom-smart-fields): sync Cal.com data into your signatures.
* [Calendly](/en/integrations/smart-fields/calendly-smart-fields): sync Calendly data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Cloudtalk
Source: https://help.scribe-mail.com/en/integrations/smart-fields/cloudtalk-smart-fields
Keep email signatures accurate and up to date by syncing teammate details from CloudTalk, your cloud call-center phone system, such as direct phone numbers.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Cloudtalk as a data source.
**No action needed from your teammates.**
**Changes in your Cloudtalk auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
Contact our support to activate the integration. Click **Contact support** and our team will help you get set up.
## Related articles
* [Dialpad](/en/integrations/smart-fields/dialpad-smart-fields): sync Dialpad data into your signatures.
* [Nextiva](/en/integrations/smart-fields/nextiva-smart-fields): sync Nextiva data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Deel
Source: https://help.scribe-mail.com/en/integrations/smart-fields/deel-smart-fields
Keep email signatures accurate and up to date by syncing employee details from Deel, your global HR and payroll platform, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Deel as a data source.
**No action needed from your teammates.**
**Changes in your Deel auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
### Prerequisites
* A Scribe account with admin access
* An **Admin** role in Deel
You must be an **Admin in Deel** to install this integration.
Click **Connect Deel** to start the setup.
If you are already logged in, this step will be skipped.
Once you authorize, the integration connects automatically.
## Related articles
* [Gusto](/en/integrations/smart-fields/gusto-smart-fields): sync Gusto data into your signatures.
* [Hibob](/en/integrations/smart-fields/hibob-smart-fields): sync Hibob data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Dialpad
Source: https://help.scribe-mail.com/en/integrations/smart-fields/dialpad-smart-fields
Keep email signatures accurate and up to date by syncing teammate details from Dialpad, your cloud phone and contact-center system, such as phone numbers.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Dialpad as a data source.
**No action needed from your teammates.**
**Changes in your Dialpad auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
Contact our support to activate the integration. Click **Contact support** and our team will help you get set up.
## Related articles
* [Nextiva](/en/integrations/smart-fields/nextiva-smart-fields): sync Nextiva data into your signatures.
* [Aircall](/en/integrations/smart-fields/aircall-smart-fields): sync Aircall data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Gusto
Source: https://help.scribe-mail.com/en/integrations/smart-fields/gusto-smart-fields
Keep email signatures accurate and automatically up to date by syncing employee details from Gusto, your HR and payroll platform, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Gusto as a data source.
**No action needed from your teammates.**
**Changes in your Gusto auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
### Prerequisites
* A Scribe account with admin access
This integration requires activation by our team. Click **Contact support** to get started.
## Related articles
* [Hibob](/en/integrations/smart-fields/hibob-smart-fields): sync Hibob data into your signatures.
* [Lattice](/en/integrations/smart-fields/lattice-smart-fields): sync Lattice data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Hibob
Source: https://help.scribe-mail.com/en/integrations/smart-fields/hibob-smart-fields
Keep email signatures accurate and automatically up to date by syncing employee details from HiBob, your HR platform, like job title, department, and location.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Hibob as a data source.
**No action needed from your teammates.**
**Changes in your Hibob auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
### Prerequisites
* A Scribe account with admin access
This integration requires activation by our team. Click **Contact support** to get started.
## Related articles
* [Lattice](/en/integrations/smart-fields/lattice-smart-fields): sync Lattice data into your signatures.
* [Lucca](/en/integrations/smart-fields/lucca-smart-fields): sync Lucca data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Lattice
Source: https://help.scribe-mail.com/en/integrations/smart-fields/lattice-smart-fields
Keep email signatures accurate and up to date by syncing employee details from Lattice, your HR and performance platform, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Lattice as a data source.
**No action needed from your teammates.**
**Changes in your Lattice auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
### Prerequisites
* A Scribe account with admin access
This integration requires activation by our team. Click **Contact support** to get started.
## Related articles
* [Lucca](/en/integrations/smart-fields/lucca-smart-fields): sync Lucca data into your signatures.
* [Okta](/en/integrations/smart-fields/okta-smart-fields): sync Okta data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Lucca
Source: https://help.scribe-mail.com/en/integrations/smart-fields/lucca-smart-fields
Keep email signatures accurate and automatically up to date by syncing employee details from Lucca, your HR software, like name, job title, and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Lucca as a data source.
**No action needed from your teammates.**
**Changes in your Lucca auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/lucca).
## Installation guide
### Prerequisites
* Admin access to your Lucca account
* A Scribe account with admin access
Your Lucca domain looks like `your-company.ilucca.net`. Copy it from the URL bar and paste it in the **Domain** field in Scribe.
Under the **Security** section, click **API keys**.
For example, enter `API key for Scribe`.
Check the **Consult / create / modify users** permission under the **Co-workers** scope.
Under **API key usage**, select **Third-party publisher** and enter `Scribe` as the publisher name.
Copy the API key from Lucca and paste it in the **API Key** field in Scribe, then click **Connect Lucca**.
## Related articles
* [Okta](/en/integrations/smart-fields/okta-smart-fields): sync Okta data into your signatures.
* [Payfit](/en/integrations/smart-fields/payfit-smart-fields): sync Payfit data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Nextiva
Source: https://help.scribe-mail.com/en/integrations/smart-fields/nextiva-smart-fields
Keep email signatures accurate and up to date by syncing teammate details from Nextiva, your cloud business phone system, such as direct phone numbers.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Nextiva as a data source.
**No action needed from your teammates.**
**Changes in your Nextiva auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
Contact our support to activate the integration. Click **Contact support** and our team will help you get set up.
## Related articles
* [Aircall](/en/integrations/smart-fields/aircall-smart-fields): sync Aircall data into your signatures.
* [Cloudtalk](/en/integrations/smart-fields/cloudtalk-smart-fields): sync Cloudtalk data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Okta
Source: https://help.scribe-mail.com/en/integrations/smart-fields/okta-smart-fields
Keep email signatures accurate and up to date by syncing user profile details from Okta, your identity provider, like name, job title, and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Okta as a data source.
**No action needed from your teammates.**
**Changes in your Okta auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/okta).
## Installation guide
### Prerequisites
* Admin access to the Okta admin console
* A Scribe account with admin access
Select **OIDC - OpenID Connect** as the sign-in method and **Single-Page Application** as the application type.
Enter a name like `Scribe integration` and check the **Refresh Token** grant type.
Copy the callback URL below and paste it in the **Sign-in redirect URIs** field in Okta.
```text theme={null}
https://app.scribe-mail.com/callbacks/okta
```
In the **Client Credentials** section, copy the **Client ID** and paste it in the corresponding field in Scribe.
Click on your profile in the top-right corner of the Okta admin console to find your Okta domain (e.g. `dev-12345678.okta.com`). Copy it and paste it in the **Domain** field in Scribe.
In your Okta application, go to the **Okta API Scopes** tab and click **Grant** next to `okta.users.read` and `okta.schemas.read`.
## Related articles
* [Payfit](/en/integrations/smart-fields/payfit-smart-fields): sync Payfit data into your signatures.
* [Rippling](/en/integrations/smart-fields/rippling-smart-fields): sync Rippling data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Outreach
Source: https://help.scribe-mail.com/en/integrations/smart-fields/outreach-smart-fields
Keep email signatures accurate and up to date by syncing teammate details from Outreach, your sales engagement platform, so rep mailboxes stay current.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Outreach as a data source.
**No action is needed from your teammates.**
**Changes in your Outreach auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/outreach).
## Installation guide
### Prerequisites
* Admin access to your Outreach account
* A Scribe account with admin access
You must be an **Admin in Outreach** to install this integration.
Click **Connect Outreach** to start the integration.
If you are already logged in, this step will be skipped.
Once you authorize, the integration connects automatically. Click **Authorize** to grant Scribe access to read and write mailboxes.
## Related articles
* [Outreach](/en/integrations/signatures/outreach-client-side): install Scribe signatures in Outreach.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
* [Signature detail page](/en/signature-detail-page): see which Smart Fields a signature uses.
# Payfit
Source: https://help.scribe-mail.com/en/integrations/smart-fields/payfit-smart-fields
Keep email signatures accurate and up to date by syncing employee details from PayFit, your HR and payroll platform, like job title and department.
Follow these steps to [auto-fill your teammates' signatures](/en/smart-fields) using Payfit as a data source.
**No action is needed from your teammates.**
**Changes in your Payfit auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/payfit).
## Installation guide
### Prerequisites
* Admin access to your Payfit account
* A Scribe account with admin access
You must be an **Admin in Payfit** to install this integration.
Click **Connect Payfit** to start the integration.
If you are already logged in, this step will be skipped.
Choose the Payfit account and company you want to connect to Scribe.
Scribe has only read access to your data. Click **Authorize** to complete the connection.
## Related articles
* [Rippling](/en/integrations/smart-fields/rippling-smart-fields): sync Rippling data into your signatures.
* [UKG](/en/integrations/smart-fields/ukg-smart-fields): sync UKG data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Rippling
Source: https://help.scribe-mail.com/en/integrations/smart-fields/rippling-smart-fields
Keep email signatures accurate and automatically up to date by syncing employee details from Rippling, your HR and IT platform, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Rippling as a data source.
**No action needed from your teammates.**
**Changes in your Rippling auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/rippling).
## Installation guide
### Prerequisites
* Admin access to your Rippling account
* A Scribe account with admin access
You must be an **Admin in Rippling** to install this integration.
Click **Go to Rippling app store** to start the integration.
If you are already logged in, this step will be skipped.
On the Scribe app page in the Rippling app store, click **Connect account**.
Select **Yes, I'll install this integration** to confirm that you manage Scribe for your organization, then click **Continue**.
Scribe has only read access to your data. Review the requested permissions and click **Authorize**.
Choose who should have an account for Scribe. The recommended option is **Everyone except contractors should have an account**. Click **Continue**.
Choose when employees should get access to Scribe. The recommended option is **As soon as they've signed their offer letter or agreement**. Click **Continue**.
Click **Continue** to connect your Scribe account to Rippling and complete the integration.
## Related articles
* [UKG](/en/integrations/smart-fields/ukg-smart-fields): sync UKG data into your signatures.
* [Workday](/en/integrations/smart-fields/workday-smart-fields): sync Workday data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# UKG
Source: https://help.scribe-mail.com/en/integrations/smart-fields/ukg-smart-fields
Keep email signatures accurate and up to date by syncing employee details from UKG, your HR and workforce management system, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using UKG as a data source.
**No action needed from your teammates.**
**Changes in your UKG auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
Contact our support to activate the integration. Click **Contact support** and our team will help you get set up.
## Related articles
* [Workday](/en/integrations/smart-fields/workday-smart-fields): sync Workday data into your signatures.
* [Workleap Pingboard](/en/integrations/smart-fields/workleap-pingboard-smart-fields): sync Workleap Pingboard data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Workday
Source: https://help.scribe-mail.com/en/integrations/smart-fields/workday-smart-fields
Keep email signatures accurate and up to date by syncing employee details from Workday, your HR and finance platform, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Workday as a data source.
**No action needed from your teammates.**
**Changes in your Workday auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/what-scribe-does-concerning-security).
## Installation guide
Contact our support to activate the integration. Click **Contact support** and our team will help you get set up.
## Related articles
* [Workleap Pingboard](/en/integrations/smart-fields/workleap-pingboard-smart-fields): sync Workleap Pingboard data into your signatures.
* [BambooHR](/en/integrations/smart-fields/bamboohr-smart-fields): sync BambooHR data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Workleap Pingboard
Source: https://help.scribe-mail.com/en/integrations/smart-fields/workleap-pingboard-smart-fields
Keep email signatures accurate and up to date by syncing details from Workleap Pingboard, your org-chart and directory tool, like job title and department.
Follow these steps to [auto-fill your teammate's signatures](/en/smart-fields) using Workleap Pingboard as a data source.
**No action needed from your teammates.**
**Changes in your Workleap Pingboard auto-sync to Scribe.**
**SOC 2 Type II Certified.** [Your data is safe](/en/security/data-collection/pingboard).
## Installation guide
### Prerequisites
* Admin access to your Pingboard account
* A Scribe account with admin access
In your Pingboard account, open the **Settings** menu and click **Add-Ons**.
Select the **Pingboard API** add-on from the list.
On the Pingboard API page, click **Manage Service Accounts**.
Click **+ New Service Account** to create a new service account for Scribe.
Enter **Scribe** as the name for the service account, then click **Save**.
Copy the **Client ID** and **Client Secret** from Pingboard using the **Copy** buttons, then paste them into the corresponding fields in Scribe. Click **Connect Pingboard** to complete the integration.
## Related articles
* [BambooHR](/en/integrations/smart-fields/bamboohr-smart-fields): sync BambooHR data into your signatures.
* [Ceridian Dayforce](/en/integrations/smart-fields/ceridian-dayforce-smart-fields): sync Ceridian Dayforce data into your signatures.
* [Assign teammates to a signature](/en/assign-teammates-to-a-signature): use Smart Field conditions to assign signatures automatically.
# Google Workspace
Source: https://help.scribe-mail.com/en/integrations/teammates/google-workspace-teammates
Connect Google Workspace to Scribe and sync the teammates you choose from your units and groups, with details and future changes kept up to date automatically.
Follow these steps to sync your Google Workspace organizational units, groups and teammates with Scribe.
**Select only the teammates you want to sync with Scribe.**
**Changes in your Google Workspace auto-sync to Scribe.**
**SOC 2 Type II Certified.** Your data is safe.
## Installation guide
### Prerequisites
* A Scribe account with admin access
* A Google Workspace account with **Super Admin** privileges
Import selected teammates from your Google Workspace. You control who gets synced.
You must be a **Super Admin** in Google Workspace to install this integration.
Click **Connect Google Workspace** to start the setup.
Scribe is SOC 2 Type II compliant. You can find the scopes we use from the Google API [here](https://support.google.com/a/answer/162106). We can't send or read your emails.
You can select teammates from your teammates list, Units, or Groups. Select which ones to import now. You can add more later. Their information is also synced so you can auto-fill their signatures later using [Smart Field](/en/smart-fields).
Go to Signatures to [assign teammates](/en/assign-teammates-to-a-signature) and create their signatures. Future updates in your Google Workspace will be automatically synced with Scribe (new employees, job changes, etc.).
## Related articles
* [Teammates overview](/en/teammates/teammates-overview)
* [Microsoft Entra ID](/en/integrations/teammates/microsoft-entra-id-teammates)
* [What Scribe does concerning security](/en/what-scribe-does-concerning-security)
# Microsoft Entra ID
Source: https://help.scribe-mail.com/en/integrations/teammates/microsoft-entra-id-teammates
Connect Microsoft Entra ID to Scribe and sync the teammates you choose from your administrative units and groups, with changes kept up to date automatically.
Follow these steps to sync your Entra ID administrative units, groups and teammates with Scribe.
**Select only the teammates you want to sync with Scribe.**
**Changes in your Entra ID auto-sync to Scribe.**
**SOC 2 Type II Certified.** Your data is safe.
## Installation guide
### Prerequisites
* A Scribe account with admin access
* A Microsoft Entra ID account with **Global Admin** privileges
You must be a **Global Admin in Entra ID** to install this integration.
Click **Connect Entra ID** to start the setup.
Import selected teammates from your Entra ID. You control who gets synced.
Scribe is SOC 2 Type II compliant. We can't send or read your emails.
You can select teammates from your teammates list, Administrative units, or Groups. Select which ones to import now. You can add more later. Their information is also synced so you can auto-fill their signatures later using [Smart Field](/en/smart-fields).
Go to Signatures to [assign teammates](/en/assign-teammates-to-a-signature) and create their signatures. Future updates in your Entra ID will be automatically synced with Scribe (new employees, job changes, etc.).
## Related articles
* [Teammates overview](/en/teammates/teammates-overview)
* [Google Workspace](/en/integrations/teammates/google-workspace-teammates)
* [What Scribe does concerning security](/en/what-scribe-does-concerning-security)
# Zoho Mail
Source: https://help.scribe-mail.com/en/integrations/teammates/zoho-mail-teammates
Connect Zoho Mail to Scribe and sync the teammates you choose from your users and groups, with details and future changes kept up to date automatically.
Follow these steps to sync your Zoho Mail users and groups with Scribe.
**Select only the teammates you want to sync with Scribe.**
**Changes in your Zoho Mail auto-sync to Scribe.**
**SOC 2 Type II Certified.** Your data is safe.
## Installation guide
### Prerequisites
* A Scribe account with admin access
* A Zoho Mail organization, with a **Super Admin** or **Admin** account
Import selected teammates from your Zoho Mail organization. You control who gets synced.
You must be a **Super Admin or Admin in Zoho Mail** to install this integration.
Click **Connect Zoho Mail** to start the setup.
If you are already signed in to Zoho, this step is skipped.
Scribe only reads your users, their aliases, your groups and your domains. It changes nothing in Zoho Mail and can't send or read your emails. You can find the scopes we use from the Zoho Mail API [here](/en/security/scopes-used-from-zoho-mail).
Check **I allow Scribe to access the above data from my Zoho account**, then click **Accept**.
You can select teammates from your teammates list or Groups. Select which ones to import now. You can add more later. Their information is also synced so you can auto-fill their signatures later using [Smart Field](/en/smart-fields).
Two options sit under the list:
* **Auto-sync new teammates added to Zoho Mail**: new users in your organization are imported as they appear.
* **Import email aliases**: each teammate's confirmed aliases are imported too, so each alias can get its own signature.
Go to Signatures to [assign teammates](/en/assign-teammates-to-a-signature) and create their signatures. Future updates in your Zoho Mail will be automatically synced with Scribe (new employees, name changes, etc.).
## What Scribe syncs from Zoho Mail
Scribe imports the users of your Zoho Mail organization that have an active mailbox. A user whose mailbox is disabled, or whose account is deactivated, is not imported, and is removed from Scribe at the next sync.
For each teammate, Scribe reads the fields of the user's page in the Zoho Mail Admin Console:
* First name and last name
* Email address and, if you import them, confirmed aliases
* Mobile phone and work phone
* Street address, city, state or province, zip or postal code, and country
* Custom information fields
* Job position and department, when Zoho fills them for your users
The Zoho Mail Admin Console has no job title field. To sync one, add it as a custom information field in Zoho Mail, then map it to the Job position [Smart Field](/en/smart-fields).
Zoho Mail does not share profile pictures with Scribe. To show a photo in a signature, map the profile picture [Smart Field](/en/smart-fields) to another source, or fill it in Scribe.
Scribe syncs your Zoho Mail organization once a day. Click **Refresh** on the Teammates page to sync at any time.
Scribe supports Zoho accounts in every Zoho data center except China (zoho.com.cn). One Zoho Mail organization can be connected to one Scribe workspace.
## Disconnect Zoho Mail
When you disconnect Zoho Mail, Scribe revokes its access to your organization. Your teammates stay in Scribe as manual teammates. If you connect Zoho Mail again later, Scribe links the same teammates back instead of creating duplicates.
## Troubleshooting
If the connection fails, Scribe shows one of these messages:
| Message | What to do |
| - | - |
| You need to be an admin of your Zoho Mail organization to activate this integration. | Sign in to Zoho with a **Super Admin** or **Admin** account, or invite an admin to your Scribe workspace to connect it. |
| This Zoho Mail organization is already linked to another Scribe workspace. | Disconnect Zoho Mail from the other workspace first, or connect from that workspace. |
| This domain is already linked to another Scribe workspace. | Your Zoho Mail domain belongs to another Scribe workspace. Connect from that workspace, or contact us. |
| This email is already linked to another Scribe workspace. | Your Zoho Mail address is a teammate in another Scribe workspace. Connect from that workspace, or contact us. |
| Scribe does not support the Zoho data center of your account. | Your Zoho account is hosted in China, which Scribe does not support. |
| There is an issue with your credentials. Please try again. | Start again from **Connect Zoho Mail** and accept all the scopes. |
| Zoho Mail is not responding. Please try again in a few minutes. | Zoho did not answer. Wait a few minutes and try again. |
If Scribe loses access to your Zoho Mail organization later, see [Zoho Mail access lost](/en/troubleshooting/zoho-mail-access-lost).
## Related articles
* [Teammates overview](/en/teammates/teammates-overview)
* [Zoho Mail signatures](/en/integrations/signatures/zoho-mail)
* [Scopes used from Zoho Mail](/en/security/scopes-used-from-zoho-mail)
* [What Scribe does concerning security](/en/what-scribe-does-concerning-security)
# Marketing Campaign
Source: https://help.scribe-mail.com/en/marketing-campaign
Run marketing campaigns inside your team's email signatures: target by signature or smart field, design a banner, schedule dates, then track clicks and CTR.
This guide walks you through creating a [marketing campaign](/en/marketing-overview), designing the marketing block, and managing active campaigns.
## Create a campaign
Navigate to **Campaigns** in the left sidebar and click **+ Create campaign** in the top right corner. This opens the Create Campaign modal (step 1 of 2).
Fill in the **Campaign Details** section:
* **Name.** Give your campaign a descriptive name (2 to 25 characters).
* **Apply this campaign.** Choose how to target teammates:
* **By Signatures.** Select one or more signature templates from the dropdown. All teammates using those signatures will receive the campaign.
* **By Smart Field.** Define targeting rules using any [Smart Field](/en/smart-fields) from any source connected to Scribe. For example, "If Department is any of Sales" or "If Location is any of Paris." Click **+ Add Rule** to combine multiple conditions and target exactly the teammates you need.
In the **Campaign Dates** section:
* **Time Zone.** Select your time zone from the dropdown (e.g., Guadalajara GMT-6, Berlin GMT+2, Paris GMT+2).
* **From.** Pick the start date and time for the campaign.
* **To.** Pick the end date and time.
* **Frequency.** Choose how often the campaign runs:
* **One time only.** Runs once for the defined period.
* **Monthly.** Repeats automatically every month.
* **Quarterly.** Repeats automatically every quarter.
* **Yearly.** Repeats automatically every year.
Under **Campaign Options**, you have two optional settings:
* **Keep existing marketing blocks in signatures.** When checked, the new campaign's marketing elements are combined with any existing ones already in teammates' signatures. When unchecked, the new campaign replaces any current marketing elements.
* **Notify team by email when campaign starts.** Sends an email to all targeted teammates letting them know a new marketing campaign has been added to their signature. Click **Preview email** to see what the notification looks like.
If some teammates are already part of an active campaign, a warning will appear letting you know. Running this campaign will combine marketing elements from both campaigns in their signatures.
Click **Next** to proceed to step 2 of 2. This opens the campaign editor where you'll design the marketing element that will appear in signatures.
The editor has three panels:
* **Left panel (Actions).** Shows your signature structure tree with Undo/Redo controls and an **+ Add Block** button at the bottom.
* **Center panel (Preview).** Live preview of the signature with the marketing block. Use the left/right arrows to cycle through different signature templates if multiple are targeted.
* **Right panel (Content).** Appears when you select a marketing block, letting you customize its content and style.
Click **+ Add Block** to open the block picker. Choose from the available marketing block types:
Socials, Banner, Button, Browser store, Food delivery, Games store, Product Hunt, Y Combinator, Podcast, Store apps, Ratings, Live streaming, TV streaming, Online store, Reading apps, and Music streaming.
After selecting a block type, it appears in the signature preview, and the **Content** panel opens on the right. Depending on the block type, you can configure:
**Content**
* **Image.** Upload or link to an image. A thumbnail preview is shown.
* **Image Link.** The URL that opens when someone clicks the marketing element.
**Style**
* **Appearance.** Adjust opacity and border radius.
* **Layout.** Set the height and width in pixels.
* **Colors.** Choose a background color.
* **Margin.** Control spacing around the block.
The live preview in the center panel updates as you make changes.
When you're happy with the campaign, you have two options:
* **Create Campaign.** Launches the campaign immediately (or at the scheduled start time). A success confirmation appears with the campaign name and end date.
* **Save as Draft.** Saves the campaign without activating it. You can come back to launch it later.
## View campaign details
Click on any campaign from the Campaigns list (or the eye icon under **Actions**) to open the campaign detail page. Here you'll find:
* **Campaign name and status** (Active / Inactive) at the top.
* **Campaign Information.** Shows the number of signatures, start date, and end date.
* **Conversion Rate** section with three metrics:
* **Total views.** Number of times the marketing element was displayed.
* **Total clicks.** Number of clicks on the marketing element.
* **Average CTR.** Click-through rate as a percentage.
* **Timeline chart.** Visual breakdown of clicks over the campaign period.
* **Signatures panel** (right side). Searchable list of all signatures included in the campaign, each showing the marketing element in context.
## Pause a campaign
From the campaign detail page, click the **Pause** button. A confirmation dialog will appear explaining that campaign marketing elements will no longer appear in signatures and will be replaced with the previous marketing elements.
Click **Pause campaign** to confirm, or **Cancel** to keep it running.
Pausing a campaign immediately removes the marketing elements from all affected signatures. You can resume a paused campaign at any time to re-activate it.
## Resume a campaign
From the detail page of a paused campaign, click **Resume** to reactivate it. The marketing elements will reappear in all targeted signatures.
## Edit a campaign
Paused campaigns can be edited. From the detail page of a paused campaign, click the **Edit** button to modify the campaign details, targeting, dates, or marketing block. Once you're done, resume the campaign to push your changes live.
## Duplicate a campaign
Click the **Duplicate** button on the campaign detail page to create a copy of the campaign. This is useful when you want to run a similar campaign with minor adjustments, like a new date range or updated banner image, without starting from scratch.
## Delete a campaign
Click the **Delete** button on the campaign detail page to permanently remove the campaign. If the campaign is currently active, marketing elements will be removed from all affected signatures before deletion.
## Related articles
* [Marketing campaigns overview](/en/marketing-overview): how campaigns work, targeting, scheduling, and block types.
* [Analytics](/en/analytics-overview): measure views, clicks, and CTR for your campaigns.
* [Add a promotional banner](/en/can-i-add-a-promotional-banner-in-my-email-signature): design and use cases for signature banners.
* [Smart Fields](/en/smart-fields): build targeting rules from synced teammate data.
# Email signature marketing campaigns
Source: https://help.scribe-mail.com/en/marketing-overview
Turn every email your team sends into a marketing channel: add campaign banners to signatures centrally and roll them out automatically across the team.
Marketing campaigns let you add [promotional banners](/en/can-i-add-a-promotional-banner-in-my-email-signature), buttons, and other marketing elements to your teammates' email signatures, turning every outgoing email into a branded touchpoint. Instead of relying on teammates to update their own signatures, you control the campaign centrally, and it rolls out automatically.
## Why use marketing campaigns
Every email your team sends is a chance to promote something: a product launch, an upcoming event, a new blog post, a podcast, or an app download. Marketing campaigns let you take advantage of that real estate without disrupting anyone's workflow. Campaigns are deployed directly into signatures, so there's nothing for teammates to do. The marketing element simply appears in their outgoing emails for the duration you set.
You get full visibility into performance with built-in [analytics](/en/analytics-overview): total views, total clicks, and average click-through rate, updated over time so you can see what's working.
## How campaigns work
A campaign adds one or more **marketing blocks** to existing email signatures for a defined period of time. When the campaign ends, signatures revert to their previous state automatically.
Here's the general flow:
1. **Create a campaign.** Give it a name, choose which teammates or signatures to target, set a date range and time zone.
2. **Design the marketing block.** Pick from a library of block types (banners, buttons, social links, app store badges, and more) and customize the content and style.
3. **Launch.** The marketing elements appear in your teammates' signatures immediately. Optionally notify the team by email.
4. **Track performance.** Monitor views, clicks, and CTR from the campaign detail page.
5. **Pause, edit, or end.** Pause the campaign at any time to remove marketing elements from signatures. Edit a paused campaign to adjust targeting, dates, or the marketing block, then resume it. Or let it run to its end date and signatures revert automatically.
## Campaign targeting
You can apply a campaign in two ways:
* **By Signatures.** Select one or more specific signature templates. Every teammate using those signatures will see the campaign.
* **By Smart Field.** Define targeting rules based on any [Smart Field](/en/smart-fields) from any source connected to Scribe. Combine multiple conditions to target exactly the right teammates (for example, "Department is Sales" and "Location is Paris"). This gives you fine-grained control over who sees the campaign without manually picking signatures.
## Campaign scheduling
Each campaign has a **From** and **To** date with a specific time, set in your chosen time zone (Guadalajara, Berlin, Paris, etc.). You also choose a **frequency**:
* **One time only.** Runs once for the defined period.
* **Monthly.** Repeats automatically every month.
* **Quarterly.** Repeats automatically every quarter.
* **Yearly.** Repeats automatically every year.
## Marketing block types
When building a campaign, you can add any of the following marketing blocks to your signatures:
| Category | Block types |
| - | - |
| Links & CTAs | Button, Banner, Socials |
| App promotion | Browser store, Store apps, Games store |
| Content | Podcast, Live streaming, TV streaming, Music streaming, Reading apps |
| Social proof | Product Hunt, Y Combinator, Ratings |
| Commerce | Online store, Food delivery |
Each block can be customized with its own image, link, size, border radius, opacity, background color, and margins.
## Campaign analytics
Once a campaign is active, the detail page shows real-time performance data:
* **Total views.** How many times the marketing element was displayed in signatures.
* **Total clicks.** How many times recipients clicked on the marketing element.
* **Average CTR.** The click-through rate across all signatures in the campaign.
A timeline chart shows click volume over the campaign period so you can spot trends and measure the impact of your promotions.
## Campaign statuses
Campaigns can be in one of three states:
* **Active.** Currently running and visible in teammates' signatures.
* **Inactive.** Paused or ended. Marketing elements have been removed from signatures.
* **Archived.** No longer active and moved to the Archived tab for reference.
The Campaigns page organizes campaigns across three tabs: **Active Campaigns**, **Inactive Campaigns**, and **Archived Campaigns**, each showing a count of campaigns in that state.
## Related articles
* [Create a marketing campaign](/en/marketing-campaign): set up targeting, scheduling, and the marketing block step by step.
* [Analytics](/en/analytics-overview): track views, clicks, and CTR for every campaign.
* [Add a promotional banner](/en/can-i-add-a-promotional-banner-in-my-email-signature): formats, sizing, and use cases for signature banners.
* [Smart Fields](/en/smart-fields): target campaigns by department, location, or any synced field.
# Members
Source: https://help.scribe-mail.com/en/members
Invite people to your Scribe workspace at no extra cost and assign each one an Owner, Admin, or Member role that controls what they can manage.
Members are the people who can log into your Scribe [workspace](/en/workspaces), not the teammates whose signatures you're managing. What each member can do depends on their role: Owners and Admins manage signatures, campaigns, and settings, while someone with the Member role can only edit and install their own signature. You can invite as many members as you want [at no extra cost](/en/plans) and assign each one a role that matches their responsibilities.
Members and teammates are different things in Scribe. **Members** log into the workspace, and only Owners and Admins can manage it. **[Teammates](/en/teammates/teammates-overview)** are the people whose email signatures you create and deploy. One person can be both.
## Roles and access levels
Every member is assigned one of three roles. You can change a member's role at any time from the Access Level dropdown in the members table.
### Owner
Full workspace control including deletion. Can update all settings and invite members. Only one owner is allowed per workspace, and only the current owner can transfer ownership.
### Admin
Can change workspace settings and invite new members. Cannot delete the workspace or transfer ownership.
### Member
Can edit their own signature information and install their signature. No access to templates, campaigns, workspace settings, or other management features.
## Invite a new member
Click **+ Add Members** in the top right of the Members page.
Type the new member's email address in the **Email** field, then pick a role from the **Role** dropdown. The dropdown describes what each role can do to help you choose.
Click **Send invitation**. A confirmation screen appears showing who was invited and which role they were assigned.
The new member will appear in the table with a **Pending** status until they accept the invitation.
## Resend an invitation
If a member hasn't accepted their invitation yet, you can resend it. Find the member in the table (they'll show a **Pending** status) and click the envelope icon in the Actions column.
## Change a member's role
Click the **Access Level** dropdown next to any member and select a new role. The change takes effect immediately. You cannot change the Owner role this way. Only the current Owner can transfer ownership.
## Remove a member
Click the trash icon in the Actions column for the member you want to remove. A confirmation dialog will ask you to confirm, since removing a member permanently revokes their access to the workspace. Click **Delete** to confirm or **Cancel** to go back.
Removing a member is permanent. They will lose all access to the workspace immediately.
## Related articles
* [Account](/en/account): manage your personal profile that follows you across workspaces.
* [Workspaces](/en/workspaces): create and manage the workspaces members belong to.
* [Configure SSO/SAML](/en/security/how-do-i-configure-sso-saml-in-scribe): let members sign in with your identity provider.
# Plan limits and changes
Source: https://help.scribe-mail.com/en/plan-limits-and-changes
Learn what the Scribe free plan and free trial include, the limits on each plan, and what happens to your signatures when your plan changes.
This guide explains what the free plan and free trial include, the limits that apply to each plan, and what happens to your signatures when your plan changes, such as when your trial ends or a paid plan is cancelled.
For a full feature comparison and pricing, see [Plans](/en/plans) and [Pricing](/en/pricing).
## The free plan
The free plan lets you try Scribe with a small team. It includes up to 2 users and one signature, and works with the core email providers: Gmail, Microsoft 365, Outlook, and Apple Mail.
On the free plan, your signatures show a "Made with Scribe" watermark. Paid features such as removing the watermark, signature folders, signature variants, marketing campaigns, importing teammates by CSV, assignment rules, and additional integrations are not included. See [Plans](/en/plans) for the full list.
## The free trial
When you sign up, Scribe starts a free trial that lasts 14 days. You can see how many days remain in your settings.
The free trial unlocks every Scribe feature with one exception: the "Made with Scribe" watermark still appears on your signatures during the trial. The watermark is removed when you move to a paid plan.
During the trial you can add as many users and signatures as you need. When the trial ends, your workspace moves to the free plan, which changes what stays active. See [What happens when your plan changes](#what-happens-when-your-plan-changes) below.
## Paid plans
Paid plans remove the watermark and unlock every feature. They do not limit how many people you can add. You pay based on the number of seats in use. See [Pricing](/en/pricing) for details.
A seat is a person whose primary email has at least one signature assigned. Alias email addresses do not count as seats and are free.
## What happens when your plan changes
When your plan can no longer cover your active signatures, Scribe turns them off so your workspace stays within its plan.
When this happens, all of your active signatures are turned off and removed from your team's email, not only the ones over the limit. Once you resolve the issue, for example by upgrading or reducing the number of users, your signatures are turned back on and reinstalled automatically.
### When your free trial ends
When your free trial ends, your workspace moves to the free plan and your active signatures are turned off and removed from your email. To keep your signatures running without interruption, upgrade to a paid plan before the trial ends. If you move to the free plan instead, you can set up signatures again within the free plan limits of 2 users and one signature.
### When you go over the free plan limit
On the free plan, if you assign signatures to more than 2 users, all of your signatures are turned off until you are back within the limit or you upgrade. Removing the extra users turns your signatures back on automatically.
### When a paid plan is cancelled or a payment fails
If you cancel a paid plan, or a payment cannot be completed, your workspace returns to the free plan and your active signatures are turned off and removed from your email. Scribe sends reminder emails before this happens, so you have time to update your payment details. When you subscribe again or your payment goes through, your signatures are turned back on and reinstalled automatically.
## Analytics data retention
How long your signature analytics, such as clicks and views, are stored depends on your plan:
* Free plan and free trial: 30 days.
* Paid plans: one year.
See [Signature analytics](/en/signature-analytics) for what Scribe tracks.
# Plans
Source: https://help.scribe-mail.com/en/plans
Compare Scribe pricing plans side by side: features, integrations, add-ons, and limits for the Free, Business, and Enterprise tiers to pick the right fit.
Scribe offers three plans to fit teams of every size. All plans include core [signature creation and deployment](/en/signatures-overview) features. Business and Enterprise unlock advanced [integrations](/en/integrations-overview), [Smart Fields](/en/smart-fields), [marketing campaigns](/en/marketing-overview), and security controls.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Price** | \$0 | From \$5/month | Custom pricing |
| **Users** | Up to 2 | 1 to 99 | 100+ (volume discount) |
| **Billing** | No billing | Monthly or yearly (save 20%) | Monthly or yearly |
Paid users are only users with primary emails assigned to a signature in Scribe. Alias emails are free of charge.
***
## Signatures
Professional branded email signatures for your team.
### Creation & Design
| | Free | Business | Enterprise |
| - | - | - | - |
| **Full customization & branding**
Create signatures that match your company's visual identity with custom colors and layouts. | ✓ | ✓ | ✓ |
| **Signature templates**
Number of unique signature designs you can create in Scribe. Each template has its own design and can be assigned to specific team members. | 1 | Unlimited | Unlimited |
| **Smart layout adaptation**
Automatically adjusts signature layout when teammate data is incomplete. If information like phone numbers or job titles is missing from user profiles, the signature design intelligently adapts to maintain proper spacing and visual proportions without showing blank fields or awkward gaps. | ✓ | ✓ | ✓ |
| **Department-specific signatures**
Create different signature designs for sales, support, marketing, and other departments. | ✗ | ✓ | ✓ |
| **Remove Scribe watermark**
Remove the "Made with Scribe" text from your signatures for a professional look. | ✗ | ✓ | ✓ |
| **Signature editor**
Easy-to-use visual editor to create and modify signatures without coding. | ✓ | ✓ | ✓ |
| **Template library**
Access to professionally designed signature templates ready to customize. | ✓ | ✓ | ✓ |
| **Marketing blocks**
Add promotional banners, events, and 16+ pre-made marketing badges to signatures. | ✓ | ✓ | ✓ |
| **Social media icons**
Add clickable 100+ social media icons (LinkedIn, Twitter, Facebook, etc.) to your email signatures. | ✓ | ✓ | ✓ |
| **Legal disclaimers**
Include required legal text and compliance information in signatures. | ✓ | ✓ | ✓ |
| **Sign-off**
Automatically add closing phrases like "Best regards" or "Sincerely" above your signature in every email. | ✓ | ✓ | ✓ |
| **GIF support**
Add animated GIFs to make signatures more engaging and eye-catching. | ✓ | ✓ | ✓ |
| **Brand asset library**
Store and organize your logos, images, and brand elements in our image library. | ✓ | ✓ | ✓ |
| **Cloud storage integrations**
Connect Canva, Dropbox, Google Drive, Box, OneDrive, and SharePoint to access your brand assets. | ✗ | ✓ | ✓ |
| **Custom signature design by our team**
Our designers create a custom signature template specifically for your brand. | ✗ | ✗ | ✓ |
### Signature Types
| | Free | Business | Enterprise |
| - | - | - | - |
| **Standard email signatures**
Regular signatures for outgoing emails to external and internal contacts. | ✓ | ✓ | ✓ |
| **Internal and reply signatures**
Signature variants for internal emails and email replies. (Microsoft users only) | ✗ | ✓ | ✓ |
| **Shared inbox signatures**
Signatures for shared team inboxes like support@ or sales\@. (Microsoft users only) | ✓ | ✓ | ✓ |
| **Alias email signatures**
Create signatures for email aliases and forwarding addresses. | ✗ | ✓ | ✓ |
### Management & Control
| | Free | Business | Enterprise |
| - | - | - | - |
| **Centrally install team signatures**
Admin can deploy signatures to all teammates automatically. | ✓ | ✓ | ✓ |
| **Monitor signature installation**
Track which team members have installed their signatures, for which integrations, on which devices, and when. | ✓ | ✓ | ✓ |
| **Push signature updates instantly**
Update all team signatures across the organization in real-time. | ✓ | ✓ | ✓ |
| **Preview signatures while composing**
See how signatures look before sending emails. | ✓ | ✓ | ✓ |
| **Organize signatures by folders**
Group and organize signatures by team, departments, companies, or countries. | ✗ | ✓ | ✓ |
| **Scribe radar brand monitoring**
Automatically monitors team signatures daily and updates them if they don't match your brand guidelines. | ✓ | ✓ | ✓ |
### Compatibility
| | Free | Business | Enterprise |
| - | - | - | - |
| **Signatures that never break**
Scribe signatures have been engineered to render perfectly between all email clients and navigators. | ✓ | ✓ | ✓ |
| **Desktop, Tablet and Mobile**
Scribe email signatures are responsive on all devices. | ✓ | ✓ | ✓ |
| **Works on all browsers**
Compatible with Chrome, Safari, Firefox, Edge, and other browsers. | ✓ | ✓ | ✓ |
| **Dark mode**
Signatures adapt to dark mode settings in email clients. | ✓ | ✓ | ✓ |
| **Gmail (Web, Desktop, iOS, Android)**
Full compatibility across all Gmail platforms depending on the integration you're using. | ✓ | ✓ | ✓ |
| **Outlook (Web, Desktop, iOS, Android)**
Full compatibility across all Outlook platforms depending on the integration you're using. | ✓ | ✓ | ✓ |
| **Apple Mail (Desktop, iOS)**
Full compatibility across all Apple Mail platforms depending on the integration you're using. | ✓ | ✓ | ✓ |
| **Zoho Mail (Web)**
Full compatibility with Zoho Mail on the web through the Zoho Mail integration. | ✓ | ✓ | ✓ |
***
## Teammates
Add teammates to Scribe automatically or manually.
### Automated
| | Free | Business | Enterprise |
| - | - | - | - |
| **Google Workspace Directory sync**
Automatically sync teammates, Groups, or Units from your Google Workspace directory. | ✓ | ✓ | ✓ |
| **Microsoft Entra ID sync**
Automatically sync teammates, Groups, or Units from your Microsoft Entra ID. | ✓ | ✓ | ✓ |
| **Zoho Mail sync**
Automatically sync teammates or Groups from your Zoho Mail organization. | ✓ | ✓ | ✓ |
### Manual
| | Free | Business | Enterprise |
| - | - | - | - |
| **Add manually**
Add team members one by one with their email and details. | ✓ | ✓ | ✓ |
| **Send email invite**
Invite team members via email to join your Scribe workspace and add their information. | ✓ | ✓ | ✓ |
| **Upload CSV file**
Bulk import team members using a spreadsheet file. | ✗ | ✓ | ✓ |
### Team Management
| | Free | Business | Enterprise |
| - | - | - | - |
| **Auto-assign teammates to signatures**
Automatically assign signatures to team members based on department, role, or any personal details. | ✗ | ✓ | ✓ |
| **Targeting and exclusion rules**
Set rules to include or exclude specific team members from getting certain signatures. | ✓ | ✓ | ✓ |
| **Keep company changes in sync**
Automatically update signatures when employee information changes in your connected email provider or HRIS. | ✓ | ✓ | ✓ |
***
## Smart Fields
Auto-fill your teammates' signatures by syncing external data sources.
### Email Providers
| | Free | Business | Enterprise |
| - | - | - | - |
| **Google Workspace Directory sync**
Sync employee information from Google Workspace Directory to auto-fill signatures and keep them updated when changes are made. | ✓ | ✓ | ✓ |
| **Microsoft Entra ID sync**
Sync employee information from Microsoft Entra ID to auto-fill signatures and keep them updated when changes are made. | ✓ | ✓ | ✓ |
| **Zoho Mail sync**
Sync employee information from Zoho Mail to auto-fill signatures and keep them updated when changes are made. | ✓ | ✓ | ✓ |
### HRIS
Sync employee information from your HR platform to auto-fill signatures and keep them updated when changes are made.
| | Free | Business | Enterprise |
| - | - | - | - |
| **BambooHR** | ✗ | ✓ | ✓ |
| **Charthop** | ✗ | ✓ | ✓ |
| **Ceridian Dayforce** | ✗ | ✓ | ✓ |
| **Deel** | ✗ | ✓ | ✓ |
| **Gusto** | ✗ | ✓ | ✓ |
| **HiBob** | ✗ | ✓ | ✓ |
| **Lattice** | ✗ | ✓ | ✓ |
| **Lucca** | ✗ | ✓ | ✓ |
| **Okta** | ✗ | ✓ | ✓ |
| **Payfit** | ✗ | ✓ | ✓ |
| **Pingboard** | ✗ | ✓ | ✓ |
| **Rippling** | ✗ | ✓ | ✓ |
| **UKG** | ✗ | ✓ | ✓ |
| **Workday** | ✗ | ✓ | ✓ |
| **Custom integrations** | ✗ | ✗ | ✓ |
### Business Phone
Sync employee phone numbers from your phone system to auto-fill signatures and keep them updated when changes are made.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Aircall** | ✗ | ✓ | ✓ |
| **Cloudtalk** | ✗ | ✓ | ✓ |
| **Dialpad** | ✗ | ✓ | ✓ |
| **Nextiva** | ✗ | ✓ | ✓ |
| **Custom integrations** | ✗ | ✗ | ✓ |
### Calendar
Sync employee booking links from your calendar system to auto-fill signatures and keep them updated when changes are made.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Calendly** | ✗ | ✓ | ✓ |
| **Chili Piper** | ✗ | ✓ | ✓ |
| **Cal.com** | ✗ | ✓ | ✓ |
| **Custom integrations** | ✗ | ✗ | ✓ |
### Sales Execution
Sync employee information from your sales platform to auto-fill signatures and keep them updated when changes are made.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Outreach** | ✗ | ✓ | ✓ |
| **Custom integrations** | ✗ | ✗ | ✓ |
***
## Integrations
Centrally install signatures to all teammates instantly.
### Automated
Admin activates integration and installs signatures for all teammates.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Google Workspace**
Admin centrally installs signatures for all Google Workspace users automatically. (Web, Desktop, iOS) | ✓ | ✓ | ✓ |
| **Microsoft 365**
Admin centrally installs signatures for all Microsoft 365 users automatically. (Web, Desktop, iOS, Android) | ✓ | ✓ | ✓ |
| **Zoho Mail**
Admin centrally installs signatures for all Zoho Mail users automatically. (Web) | ✓ | ✓ | ✓ |
| **Salesforce**
Admin centrally installs signatures for all Salesforce users automatically. (Web, Desktop) | ✗ | ✓ | ✓ |
| **Front**
Admin centrally installs signatures for all Front users automatically. (Web, Desktop) | ✗ | ✓ | ✓ |
| **Outreach**
Admin centrally installs signatures for all Outreach users automatically. (Web, Desktop) | ✗ | ✓ | ✓ |
| **Salesloft**
Admin centrally installs signatures for all Salesloft users automatically. (Web, Desktop) Each teammate has to insert their signature in the Salesloft settings. | ✗ | ✓ | ✓ |
| **Server side**
Server-side installation automatically adds signatures to emails from any device or client. Advanced set-up requiring IT. | ✗ | ✓ | ✓ |
| **Custom integrations**
We can build custom integrations for platforms not listed here if they have an API. | ✗ | ✗ | ✓ |
### Manual
Each teammate activates integration and installs their own signature.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Apple Mail**
Individual users can install signatures in Apple Mail themselves. | ✓ | ✓ | ✓ |
| **Signature HTML**
Users can copy/paste HTML code to install signatures manually. | ✓ | ✓ | ✓ |
| **Outlook Windows**
Deploy signatures on Outlook Windows through your IT management tools. | ✓ | ✓ | ✓ |
| **Outlook Mac**
Deploy signatures on Outlook Mac through your IT management tools. | ✓ | ✓ | ✓ |
***
## Marketing
Turn your email signatures into a marketing channel.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Marketing campaigns**
Create targeted signature campaigns to promote events, products, or announcements. | ✗ | ✓ | ✓ |
| **Analytics**
Track clicks, views, and engagement on signature links and marketing elements. | ✓ | ✓ | ✓ |
| **Data history**
Store marketing performance data in Scribe. | 30 days | 1 year | 1 year |
***
## Admin & Security
User management and security controls.
### User Management
| | Free | Business | Enterprise |
| - | - | - | - |
| **Workspaces**
Create separate workspaces for different organizations or clients with centralized billing. | 1 | Unlimited | Unlimited |
| **Admins**
Add unlimited administrators to help manage your Scribe workspace. | 1 | Unlimited | Unlimited |
| **Role permissions**
Set granular permissions for different admin roles and responsibilities. | ✗ | ✓ | ✓ |
### Security Features
| | Free | Business | Enterprise |
| - | - | - | - |
| **Domain verification (DNS)**
Use your own domain for signature links instead of Scribe's default domain to avoid spam filters. | ✓ | ✓ | ✓ |
| **Email authentication (DKIM)**
Set up email authentication to improve deliverability and security. | ✓ | ✓ | ✓ |
| **Multi-factor authentication (MFA)**
Add an extra layer of security with 2FA for admin accounts. | ✗ | ✓ | ✓ |
| **Domain sign-in restrictions**
Limit access to users from specific email domains only. | ✗ | ✓ | ✓ |
| **SOC 2 Type II compliance**
Your data stays secure with us. We're SOC 2 Type II certified and only request read-only access. | ✓ | ✓ | ✓ |
***
## Support
Technical human support when you need it.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Priority support**
Get faster response times and priority handling for your support requests. | ✗ | ✓ | ✓ |
| **Knowledge base**
Access self-service articles, tutorials, and troubleshooting guides. | ✓ | ✓ | ✓ |
| **Dedicated onboarding**
Personal onboarding specialist to help set up your workspace and train your team. | ✗ | ✗ | ✓ |
| **Custom invoicing**
Flexible billing options and custom payment terms. | ✗ | ✗ | ✓ |
***
## Paid Add-ons
Security and compliance add-ons available on all plans.
| | Free | Business | Enterprise |
| - | - | - | - |
| **Single sign-on (SSO/SAML)**
Allow users to sign in using your company's existing authentication system. | \$150/month | \$150/month | \$150/month |
| **Audit log**
Track and monitor all actions taken in your workspace for compliance and security. | \$100/month | \$100/month | \$100/month |
## Related articles
* [Pricing](/en/pricing): how per-user pricing, the free trial, and proration work.
* [Billing](/en/billing): manage your subscription, payment method, and invoices.
* [Plan limits and changes](/en/plan-limits-and-changes): what happens as your team grows or your plan changes.
* [ROI calculator](/en/roi-calculator): estimate the leads and time savings Scribe can deliver.
# How Scribe Mail billing works
Source: https://help.scribe-mail.com/en/pricing
How Scribe Mail billing works: what counts as a paid user, proration when teammates are added or removed, credits, refunds and nonprofit discounts. For plan prices, see the Scribe Mail pricing page.
## How does Scribe pricing work?
Scribe charges per user on a monthly or yearly basis. Choosing yearly billing saves you around 20% (the equivalent of roughly two and a half months free).
You can create an email signature on Scribe without registering. If you like what you see, sign up, and you'll start on a **14-day free trial** with no card required, all features unlocked, unlimited users, and unlimited signatures.
Once the trial ends, choose from [three plans](/en/plans):
* **Free**: 1 to 2 users, limited features.
* **Business**: From 1 to 99 users, all features included. Starts at \$5/month for a single user.
* **Enterprise**: Volume pricing for 100+ users, with all features plus dedicated support and onboarding.
For current plan prices and a per-user cost estimate, see the [Scribe Mail pricing page](https://www.scribe-mail.com/pricing). This page explains how billing itself works once you are on a plan.
You can upgrade to a paid plan directly from your Scribe settings. For Enterprise, [book a call](https://cal.com/forms/33a695aa-3046-40da-ba42-1d7cbb815da3) with our Sales team so we can make sure Scribe is the right fit.
## What is a paid user?
A paid user is a teammate [assigned to a signature template](/en/assign-teammates-to-a-signature). If you sync 1,000 users from your email provider but only assign 500 of them to signature templates, you're billed for those 500. Scribe charges for primary email addresses, not aliases.
When a teammate's primary email is assigned to multiple signature templates, they still count as a single paid user.
## How does pricing adjust when I add or remove teammates?
Your invoice adjusts automatically. Users added beyond your current plan are billed the following month on a prorated basis. When users are removed, a corresponding deduction appears on your next invoice.
For annual billing, additional users are charged monthly, giving you better control over costs. They're prorated against your annual billing cycle.
## When can I cancel my subscription?
You can cancel your monthly or yearly subscription at any time from your Scribe settings or by downgrading to the Free plan.
## Can I get my subscription refunded?
Monthly and yearly plans are non-refundable.
## Do you offer discounts for non-profits and education?
Scribe offers a **30% lifetime discount** for nonprofit organizations, public education institutions, and open-source projects.
Organizations with a ".org" domain get the discount applied automatically at checkout. Other eligible organizations can contact us via chat for a discount code.
## How does billing work?
For the Business plan, payment is made by card. Scribe supports all major payment methods.
For the Enterprise plan, bank transfer is also available for contracts over \$20K per year.
You can set up multiple billing emails in your Scribe settings to automatically redirect invoices to your accounting software or finance department.
## What happens when I deactivate a user license in my email provider?
When you deactivate a license for a user in Microsoft Entra ID or Google Workspace Directory, their signature is removed from Scribe, and the user is removed from your subscription automatically.
## What does "User changes during billing period" mean?
This refers to the number of users added or removed during the current billing cycle. You'll find the breakdown in your invoices.
## What does "Unused time" mean?
Unused time is the portion of the previous subscription you paid for but didn't use.
## What does "Credits" mean?
Credits from a previous subscription represent unused time. They're deducted from upcoming invoices.
## What does "Proration" mean?
Proration adjusts your invoice when changes happen mid-cycle. The amount reflects the difference between your new and previous subscription for the remaining time in the current period.
## What happens if I grow past 100 users?
Scribe automatically moves you to the best plan for your team size. If you start with 80 users on the Business plan and later reach 100, you'll be switched to Enterprise pricing so you always pay the best rate. The updated price details will be visible in your Scribe settings.
## Why did my invoice increase from last year?
Two things typically drive an increase: the number of users added during the year, and the number of users you plan to have for the upcoming year.
For example, if you started with 50 users on the Business plan, your estimated yearly billing would be around \$1,392 (\$116/month × 12 months). If you added 30 users during the year, your total reaches 80 users. The following invoice reflects the 80-user package minus what you already paid for 50.
Remember that every teammate assigned to a signature template counts as a paid user, even if they haven't installed their signature yet. Scribe charges for primary email addresses, not aliases.
### How to reduce your invoice
Go through your signature templates and look for teammates who don't have an installed signature. In each template, open the teammates tab and check the **Installation status** column. Filter by "Not installed" to quickly find users you might want to remove.
Navigate to the **Assignment** tab of your signature template, click the edit icon next to your current assignment type, and deselect the user from the teammates list. The user is removed from the template immediately.
Open the **[Billing](/en/billing)** tab in your Scribe settings. Your invoice updates in real time to reflect any changes.
Each invoice shows the date of issue, total amount, user count, invoice type (initial payment, renewal, or additional users), billing interval, and payment status.
If a payment fails, you can manually retry it after updating your card information.
## What do you mean by removing CO2 with Stripe Climate?
Scribe directs 1% of revenue to help scale emerging carbon removal technologies through [Stripe Climate](https://climate.stripe.com/SdlecC).
## Related articles
* [Plan limits and changes](/en/plan-limits-and-changes): how Scribe adjusts your plan as your team grows.
* [ROI calculator](/en/roi-calculator): estimate the leads and time savings Scribe can deliver.
* [Climate](/en/climate): how Scribe contributes 1% of revenue to carbon removal.
# Admin Policy Enforced
Source: https://help.scribe-mail.com/en/troubleshooting/admin-policy-enforced
Resolve the Error 400 admin_policy_enforced message when syncing Google Workspace with Scribe by updating the right admin console permissions.
When you try to sync your [Google Workspace](/en/integrations/teammates/google-workspace-teammates), you may see the error message: Error 400: admin\_policy\_enforced.
This error means your organization does not allow Scribe to access Google data.
If you received this error message, have an administrator of your Google Workspace account follow the instructions from Google's help center: [Control which third party and internal apps access Google Workspace data](https://support.google.com/a/answer/7281227).
## Related articles
* [Google Workspace access lost](/en/troubleshooting/google-workspace-access-lost)
* [Google add-in not validating](/en/troubleshooting/google-add-in-not-validating)
* [BambooHR teammate sync not working](/en/troubleshooting/bamboohr-teammate-sync-not-working)
# BambooHR teammate sync not working
Source: https://help.scribe-mail.com/en/troubleshooting/bamboohr-teammate-sync-not-working
Fix BambooHR synchronization issues in Scribe when teammate data is missing, outdated, or not syncing correctly into your workspace directory.
When synchronizing teammate data between Scribe and [BambooHR](/en/integrations/smart-fields/bamboohr-smart-fields), Scribe matches the primary email in Scribe with the work email field in BambooHR. If a teammate is not syncing correctly, it usually means their work email is missing from BambooHR.
## How to fix this
Go to the employee's profile in BambooHR and make sure they have a valid work email configured. If the work email field is empty, Scribe will not be able to match the teammate.
Once all employees have a valid work email in BambooHR, go back to Scribe and trigger a new synchronization. The data should sync right away.
If the issue persists after adding work emails and triggering a new sync, please [contact our support team](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a) for assistance.
## Related articles
* [Teammates overview](/en/teammates/teammates-overview)
* [Smart fields](/en/smart-fields)
* [Upload CSV](/en/teammates/upload-csv)
# Fix the "Channel Not Found on Front" error
Source: https://help.scribe-mail.com/en/troubleshooting/channel-not-found
Resolve the Channel Not Found on Front error when Scribe cannot match a shared inbox to a Front channel, with steps to fix your team channel setup.
The **"Channel Not Found on Front"** message means Scribe could not find a Front **channel** that matches a shared inbox address when installing its signature. Until Scribe can locate the channel, it can't install the signature for that inbox in [Front](/en/integrations/signatures/front-client-side).
## What a Front channel is
In Front, every email address is connected as a **channel**. A channel can belong to an individual teammate, or to a **team** as a shared inbox (for example `support@`, `sales@`, or `hello@`).
When Scribe installs a signature for a shared inbox, it looks up the Front channel that matches that email address and attaches the signature to the channel's team. This is what lets a whole team share the same signature on a shared inbox.
## Why this happens
Scribe raises this error when it can't resolve the shared inbox to a team channel in Front:
* **No matching channel.** No channel in Front uses that exact email address, so Scribe has nothing to attach the signature to.
* **The address isn't a channel.** The address exists in Front only as an alias or teammate, but the shared inbox itself hasn't been connected as a channel.
* **The channel isn't owned by a team.** The channel exists but belongs to an individual rather than a team, so Scribe can't create a shared team signature for it.
* **The email addresses don't match.** The address in Scribe doesn't exactly match the channel address in Front, usually a typo, an alias, or a different domain.
## Resolution
In your Front settings, check that the shared inbox is connected as a channel using that exact email address.
The channel must be owned by a team (a shared inbox), not an individual teammate, so Scribe can install a shared team signature.
Confirm the address in Scribe matches the Front channel address **exactly**: same spelling, same domain, no alias.
Once the channel is set up and the addresses line up, reinstall the signature. Scribe reuses the same installation record, so the status changes from **Failed** to **Installed** automatically once it succeeds.
If the issue persists after verifying the channel and email addresses, please [contact our support team](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a) for assistance.
## Related articles
* [User not found](/en/troubleshooting/user-not-found)
* [Forbidden access](/en/troubleshooting/forbidden-access)
* [Signature installation statuses and errors](/en/signature-installation-statuses-and-errors)
# Fix the user not found error for email aliases
Source: https://help.scribe-mail.com/en/troubleshooting/fix-user-not-found-error-for-email-aliases
Resolve the User not found error on Google Workspace by configuring the email alias as a Send mail as address inside Gmail so Scribe can apply the signature.
When Scribe tries to push a signature to [Google Workspace](/en/integrations/signatures/google-workspace-client-side) and the destination shows a **Failed** status with the message **"User not found on Google Workspace,"** the issue is almost always linked to an [email alias](/en/how-do-scribe-email-signatures-work-with-email-aliases) that has not been properly configured inside Gmail.
This article explains why the error appears and how to resolve it by adding the alias as a Send mail as address in the user's Gmail account.
## Why this error happens
Google Workspace treats primary addresses and aliases differently. An alias can receive mail without any extra setup, but sending mail from that alias (or applying a signature tied to it) requires Gmail to explicitly know about it as a Send mail as address.
If the alias only exists at the admin level in Google Workspace and has never been added inside the user's Gmail settings, Google's API returns the "User not found" response when Scribe tries to assign a signature to it. The signature cannot be deployed until the alias is registered inside Gmail.
## How to fix it
The user (or an admin acting on their behalf) needs to add the alias as a Send mail as address from their Gmail account. Once that step is complete, Scribe will be able to push the signature on the next sync.
Sign in to the Google account that owns the alias, then open Gmail. Click the gear icon in the top right corner and select **See all settings**.
Inside the settings panel, open the **Accounts and Import** tab. On some Google Workspace accounts this is simply labeled **Accounts**.
In the **Send mail as** section, click **Add another email address**. Enter the display name and the alias email address, then follow the prompts. Google may send a verification message to confirm ownership of the address.
Once added, the alias appears in the **Send mail as** list. The user can now select this address when composing a message.
Go back to Scribe and trigger a new signature push for the teammate. The signature should apply successfully and the destination status switches from **Failed** to **Sent**.
If the alias was added recently inside Google Workspace, allow a few minutes for the change to propagate before retrying the push from Scribe.
## Still seeing the error?
If the error persists after the alias is added as a Send mail as address, run through these checks. Make sure the alias is fully verified inside Gmail and not in a pending state. Confirm that the teammate's Google Workspace account has not been suspended or moved to a different organizational unit. Verify that the Scribe integration with Google Workspace is still connected with the correct admin permissions, which you can review in **Settings**, then **[Integrations](/en/integrations-overview)**.
If everything looks correct and the error continues, reach out to support from inside Scribe so the team can inspect the full API response.
## Related articles
* [User not found](/en/troubleshooting/user-not-found)
* [Is your Gmail settings correctly set up?](/en/troubleshooting/is-your-gmail-settings-correctly-set-up)
* [Google add-in not validating](/en/troubleshooting/google-add-in-not-validating)
# Forbidden access
Source: https://help.scribe-mail.com/en/troubleshooting/forbidden-access
Learn how to resolve the Front API forbidden access error by enabling API access to individual resources in Front personal settings.
When you receive the message "Front API has forbidden access to this teammate's signature," the user has not enabled API access to their individual resources in their [Front](/en/integrations/signatures/front-client-side) personal settings.
## Resolution
The user needs to access their personal Front settings, enable API access to individual resources, and then allow Scribe to install their signature.
## Related articles
* [User not found](/en/troubleshooting/user-not-found)
* [Signature installation statuses and errors](/en/signature-installation-statuses-and-errors)
* [Unable to install signature](/en/troubleshooting/unable-to-install-signature)
# Gmail iOS app: Signature not showing up
Source: https://help.scribe-mail.com/en/troubleshooting/gmail-ios-app-signature-not-showing-up
Fix your Scribe email signature not appearing in the Gmail iOS app by updating the mobile signature settings on your iPhone or iPad in a few taps.
On the [Gmail iOS app](/en/integrations/signatures/google-workspace-client-side), the signature gets installed after you send an email. So it is normal if you do not see it when you compose an email.
On the Gmail iOS app, go to "Settings."
In the Settings menu, tap on "Signature settings."
Make sure the "Mobile Signature" option is turned off. This ensures the Scribe signature is used instead of a local mobile signature.
## Related articles
* [Signature not appearing](/en/troubleshooting/signature-not-appearing)
* [Is your Gmail settings correctly set up?](/en/troubleshooting/is-your-gmail-settings-correctly-set-up)
* [Setting up Gmail Auto Responder](/en/troubleshooting/setting-up-gmail-auto-responder)
# Google add-in not validating
Source: https://help.scribe-mail.com/en/troubleshooting/google-add-in-not-validating
Troubleshoot the Scribe Google add-in when the Google Workspace validation process takes too long, gets stuck, or fails to complete successfully.
If you have been waiting for more than 30 minutes for your [Google add-in](/en/integrations/signatures/google-workspace-client-side) to be validated, check the following.
Make sure you selected the correct Google account when installing the add-in from the [Google Workspace Marketplace](https://workspace.google.com/marketplace/app/scribe/456495922678). Sometimes users select a different domain name from their Google account.
Make sure the email you selected to install the add-in is part of your Google Workspace account. You can change this email in Scribe by going to the [Integration page](/en/integrations-overview) and opening the Google Workspace integration:
Make sure to select the option "Everyone at your organization" when installing the app.
To give Scribe the required permissions, you need to be a Super Admin in your Google Workspace. Invite someone from IT if you are not a Super Admin.
This integration works for Google Workspace users, not personal Gmail accounts.
## Related articles
* [Admin Policy Enforced](/en/troubleshooting/admin-policy-enforced)
* [Google Workspace access lost](/en/troubleshooting/google-workspace-access-lost)
* [Outlook add-in installation is not validating](/en/troubleshooting/outlook-add-in-installation-not-validating)
# Google Workspace access lost
Source: https://help.scribe-mail.com/en/troubleshooting/google-workspace-access-lost
Restore Scribe access when your account is locked because Google Workspace permissions are missing, revoked, or were changed by an administrator.
In some situations, your Scribe account may be locked due to missing [access to your Google Workspace](/en/signature-installation-statuses-and-errors). To address this, follow the steps below.
Open [your Google Workspace admin console](https://admin.google.com/).
In the admin console, click on the Apps section.
Select the Google Workspace Marketplace apps option.
Find and click on the Scribe app in the list of installed Marketplace apps.
Click on Grant access to activate the required scopes and restore Scribe permissions.
## Related articles
* [Admin Policy Enforced](/en/troubleshooting/admin-policy-enforced)
* [Google add-in not validating](/en/troubleshooting/google-add-in-not-validating)
* [Sync teammates from Google Workspace](/en/integrations/teammates/google-workspace-teammates)
# Google Workspace API forbidden access
Source: https://help.scribe-mail.com/en/troubleshooting/google-workspace-forbidden-access
Fix the Google Workspace API forbidden access error by turning on the Scribe add-in for the organizational unit or group your teammate belongs to.
When you see the message "Google Workspace API has forbidden access to this teammate's signature," Scribe is not allowed to install that teammate's signature. This happens when the Scribe [Google Workspace add-in](/en/integrations/signatures/google-workspace-client-side) is turned off for the organizational unit or group the teammate belongs to.
An administrator controls which users can access the add-in from the Google Workspace admin console. To let Scribe install the signature, turn the add-in on for that teammate's organizational unit or group, or for everyone.
You need to be a Super Admin in your Google Workspace to change these settings. Invite someone from IT if you are not a Super Admin.
## Change who can access the add-in
Open [your Google Workspace admin console](https://admin.google.com/), then go to Apps, Google Workspace Marketplace apps, and Apps list.
Select Scribe in the list of installed Marketplace apps.
In the User Access section, click "View organizational units and groups". This section also shows how many organizational units the add-in is currently turned on for.
Select the organizational unit or group that includes the teammate whose signature failed to install, then set App distribution to On. To make the add-in available to your whole domain instead, choose On for everyone. Click Save.
Back in Scribe, install the teammate's signature again. Once the add-in has access, the status changes from Failed to Installed.
Changes in the Google Workspace admin console can take a few minutes to apply. If the signature still fails right after you save, wait a few minutes and reinstall.
## Related articles
* [Signature installation statuses and errors](/en/signature-installation-statuses-and-errors)
* [Google Workspace access lost](/en/troubleshooting/google-workspace-access-lost)
* [Google add-in not validating](/en/troubleshooting/google-add-in-not-validating)
* [Admin Policy Enforced](/en/troubleshooting/admin-policy-enforced)
# Enable clipboard permissions for signature HTML copying
Source: https://help.scribe-mail.com/en/troubleshooting/how-to-enable-clipboard-permissions-for-signature-html-copying
Grant clipboard permissions in Chrome, Safari, Firefox, and Edge so you can copy and paste your Scribe email signature HTML when manual install is needed.
When using Scribe to manage your email signatures, you may need to grant clipboard permissions to copy and paste the [HTML of your signature](/en/integrations/signatures/signature-html). This guide explains how to accept these permissions in all major web browsers.
## Google Chrome
When attempting to copy your signature HTML, Chrome will display a clipboard permission request at the top of the browser.
Click on "Allow" to grant permission.
If you accidentally denied permission, you can reset it by clicking the padlock or info icon in the address bar. Select "Site Settings," find "Clipboard" in the permissions list, and change it to "Allow."
After allowing permission, try copying your signature HTML again.
## Mozilla Firefox
When you attempt to copy your signature HTML, Firefox will show a permission prompt.
Click "Allow" to grant clipboard access.
If you previously denied permission, click the padlock icon in the address bar. Select "Site Permissions," find "Clipboard," and change the setting to "Allow."
Try copying your signature HTML again after granting permission.
## Microsoft Edge
When copying your signature HTML, Edge will display a permission request.
Click "Allow" to grant clipboard access.
If you need to change previously denied permissions, click the padlock icon in the address bar. Select "Site permissions," find "Clipboard," and set it to "Allow."
After allowing permission, attempt to copy your signature HTML again.
## Safari
Safari handles clipboard permissions differently. When trying to copy your signature HTML, you may see a permission prompt.
Click "Allow" to grant access.
If Safari is blocking clipboard access, go to Safari, then Preferences, then Websites. Select "Clipboard" from the side menu, find the Scribe website, and set the permission to "Allow."
Try copying your signature HTML again after allowing permission.
## Opera
When copying your signature HTML, Opera will display a permission request.
Click "Allow" to grant clipboard access.
To change permissions you have already set, click the site info icon in the address bar (usually a padlock). Select "Site settings," find "Clipboard," and change it to "Allow."
Try copying your signature HTML again after granting permission.
## Brave
When copying your signature HTML, Brave will show a permission request.
Click "Allow" to grant clipboard access.
If you need to change previously set permissions, click the shield icon in the address bar. Select "Site settings," find "Clipboard," and change it to "Allow."
After allowing permission, try copying your signature HTML again.
## Troubleshooting common issues
### Permission request not appearing
Make sure you are using the latest version of your browser. Try refreshing the page and loading it again. If the issue persists, try using a different browser temporarily.
### Still unable to copy after granting permission
Refresh the page after granting permission. If that does not work, clear your browser cache and cookies. You can also restart your browser entirely and try again.
### Permission settings reset after browser close
Check if you are using incognito or private browsing mode, which does not save permissions between sessions. Also make sure your browser settings are not configured to clear site data on exit.
If you continue experiencing issues after following these steps, please [contact our support team](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a) for assistance.
## Related articles
* [Safari compatibility](/en/troubleshooting/safari-compatibility)
* [Signature HTML for Gmail](/en/integrations/signatures/signature-html-gmail)
* [Signature HTML for Outlook](/en/integrations/signatures/signature-html-outlook)
# How to update the Scribe Microsoft add in
Source: https://help.scribe-mail.com/en/troubleshooting/how-to-update-the-scribe-microsoft-add-in
Manually approve and install updates for the Scribe Microsoft add-in through the Microsoft 365 admin center so users get the latest version safely.
## Overview
Some updates to the Scribe [add-in](/en/integrations/signatures/microsoft-365-client-side) cannot be applied automatically. In these cases, you need to manually approve the update in the Microsoft admin center. Only the admin of your Microsoft 365 organization needs to do this once. No action is required from your teammates.
## Why update?
Keeping your Scribe add-in up to date ensures access to the latest signature features, automatic signature installation for iOS and Android Outlook apps, improved performance and security, and compatibility with the latest Microsoft 365 updates.
## How to update
Go to the [Integrated apps](https://admin.cloud.microsoft.com/?#/Settings/IntegratedApps) section in your Microsoft 365 admin center.
Alternatively, navigate there manually by opening the Microsoft 365 admin center, clicking "Settings" in the left sidebar, and selecting "Integrated apps."
In the "Deployed apps" tab, locate "Scribe Mail" in the list of integrated apps. If an update is available, you will see "Upgrade" in the Status column. Click on the Scribe Mail row to open the details pane.
On the opened pane, if you see the message "Scribe Mail has updates pending," you have an update available.
Click the "Know more and update" button and follow the prompts to approve and install the latest version. The update typically takes just a few moments.
After the update completes, return to the Integrated apps page. You should now see "OK" with a green indicator in the Status column for Scribe Mail, confirming that your add-in is up to date.
## What happens after the update
Once the update is complete, all users will automatically receive the latest version of the Scribe add-in. Email signatures will be automatically installed for iOS and Android Outlook apps for applicable updates. No action is required from end users, and signatures will continue to work seamlessly across all platforms.
We recommend checking for updates periodically or whenever you are notified of new features being released. If you encounter any issues during the update process, please [contact our support team](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a).
## Related articles
* [Outlook add-in installation is not validating](/en/troubleshooting/outlook-add-in-installation-not-validating)
* [Outlook Web add-in signatures not being installed](/en/troubleshooting/outlook-web-add-in-signatures-not-being-installed)
* [Switch to new Outlook version](/en/troubleshooting/switch-to-new-outlook-version)
# Images are not showing
Source: https://help.scribe-mail.com/en/troubleshooting/images-are-not-showing
Fix images not displaying in your Apple Mail email signature from Scribe by adjusting Mail privacy settings and clearing the cached signature data.
If images are not showing when sending an email, check your privacy settings and disable the "Protect Mail Activity" option.
Sometimes, even if you disable this setting, [Apple Mail](/en/integrations/signatures/apple-mail) will not show your images. This is a known bug in Apple Mail HTML signatures. But do not worry, images will show up perfectly fine for your recipients.
## Related articles
* [Unable to install signature](/en/troubleshooting/unable-to-install-signature)
* [Signature not appearing](/en/troubleshooting/signature-not-appearing)
* [Install signatures](/en/install-signatures)
# Is your Gmail settings correctly set up?
Source: https://help.scribe-mail.com/en/troubleshooting/is-your-gmail-settings-correctly-set-up
Check your Gmail signature, mobile, and conversation settings to make sure they are not overriding or bypassing your Scribe email signature.
Ensure that your [Gmail](/en/integrations/signatures/google-workspace-client-side) settings are not bypassing the Scribe signature. In both the "for new emails use" and "on reply/forward use" dropdowns, select "my signature."
Plain Text mode strips all formatting from your emails, including your signature. Gmail remembers this setting, so if it was ever turned on, it stays on until you manually turn it off.
Here is how to check and disable it:
* Open Gmail and click **Compose** to start a new email.
* In the compose window, click the **three dots** (More options) in the bottom right corner of the compose window.
* Make sure **Plain text mode** is not checked. If it has a checkmark next to it, click it to turn it off.
Once disabled, your signature will appear correctly in all future emails.
## Related articles
* [Signature not appearing](/en/troubleshooting/signature-not-appearing)
* [Gmail iOS app: Signature not showing up](/en/troubleshooting/gmail-ios-app-signature-not-showing-up)
* [Setting up Gmail Auto Responder](/en/troubleshooting/setting-up-gmail-auto-responder)
# Outlook add-in installation is not validating
Source: https://help.scribe-mail.com/en/troubleshooting/outlook-add-in-installation-not-validating
Troubleshoot the Scribe Outlook add-in when the Microsoft validation process takes longer than expected, gets stuck, or fails to finalize installation.
If the Scribe [add-in](/en/integrations/signatures/microsoft-365-client-side) is not validated within 72 hours by Microsoft, check the following.
## The correct Microsoft account is selected
Make sure you selected the Microsoft account you want to use with Scribe. Users sometimes accidentally choose accounts from different domains. You can verify this in [Microsoft AppSource](https://appsource.microsoft.com/en-us/product/office/WA200004057).
## The correct email is selected
Make sure the email associated with your account is part of your Microsoft 365 organization. You can change this email in Scribe.
## You have selected the entire organization
Make sure to select the option "entire organization" when installing the app.
## The add-in is installed as an integrated app
Ensure the Scribe add-in is installed as an integrated app in the [Microsoft 365 admin center](https://admin.microsoft.com/Adminportal/Home#/Settings/IntegratedApps), not just in your Outlook account. Ask your IT department if necessary.
## Check your Outlook compatibility
The user requires an active Microsoft 365 subscription that includes Outlook Desktop. The Scribe Outlook add-in is compatible with the following Outlook versions.
### On Windows
The minimum compatible versions are:
* For users on the current channel: v16.0.14026.20000
* For users on the monthly channel: v16.0.14131.20000
* For users on the semi-annual channel: v16.0.14326.10000
**Where to find your Office 365 update channel?**
In Outlook desktop, click on File, then Office Account. In the "About Outlook" section, you will see your update channel.
**Where to find the version of your Outlook on Windows?**
In Outlook desktop, navigate to File, then Office Account, then About Outlook. A window will open displaying your Outlook version.
### On macOS
The Outlook add-in is compatible only with the new version of Outlook for Mac, V16.54 (21101001) and later versions.
**How to activate the [new version of Outlook](/en/troubleshooting/switch-to-new-outlook-version) for Mac?**
Activate the new Outlook version using the toggle at the top right. Click on "Open the new Outlook," and Outlook will restart using the new version.
**How to determine the version of your Outlook for Mac?**
Click on the Outlook menu at the top left, then select "About Outlook."
You have to be connected as a Microsoft 365 Global Administrator to install the Scribe Outlook add-in.
This integration works for Microsoft 365 users with licenses, not personal Outlook accounts.
This integration will install your Scribe signature on the Microsoft 365 PC and Apple desktop apps, as well as on the Microsoft 365 web version.
## Related articles
* [How to update the Scribe Microsoft add-in](/en/troubleshooting/how-to-update-the-scribe-microsoft-add-in)
* [Outlook Web add-in signatures not being installed](/en/troubleshooting/outlook-web-add-in-signatures-not-being-installed)
* [Google add-in not validating](/en/troubleshooting/google-add-in-not-validating)
# Outlook Web add in signatures not being installed
Source: https://help.scribe-mail.com/en/troubleshooting/outlook-web-add-in-signatures-not-being-installed
Fix a Scribe signature stuck during install for Outlook Web add-in users: log out of Scribe and back in, then contact support if it still does not appear.
For [Outlook Web](/en/integrations/signatures/microsoft-365-client-side) users who have installed the add in, sometimes the signature installation can get stuck.
To fix this, first log out of your Scribe account and then log back in to see if your email signature appears again in your Outlook.
If your signature still does not appear after logging back in, please [contact our support team](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a) on the chat so we can investigate the issue with your account.
## Related articles
* [Outlook add-in installation is not validating](/en/troubleshooting/outlook-add-in-installation-not-validating)
* [How to update the Scribe Microsoft add-in](/en/troubleshooting/how-to-update-the-scribe-microsoft-add-in)
* [Switch to new Outlook version](/en/troubleshooting/switch-to-new-outlook-version)
# Safari compatibility
Source: https://help.scribe-mail.com/en/troubleshooting/safari-compatibility
Understand Safari limitations when manually copying and pasting your Scribe email signature HTML code and which alternative browsers work reliably.
If you are manually copying and pasting the [HTML code of your signature](/en/integrations/signatures/signature-html) to install it on a platform not automatically integrated with Scribe, avoid using Safari. All other browsers should work fine.
We recommend using Google Chrome, Microsoft Edge, Firefox, or any Chromium based browser for the best experience when copying your signature HTML.
## Related articles
* [Enable clipboard permissions for signature HTML copying](/en/troubleshooting/how-to-enable-clipboard-permissions-for-signature-html-copying)
* [Signature HTML for Gmail](/en/integrations/signatures/signature-html-gmail)
* [Signature HTML for Outlook](/en/integrations/signatures/signature-html-outlook)
# Setting up Gmail Auto Responder
Source: https://help.scribe-mail.com/en/troubleshooting/setting-up-gmail-auto-responder
Configure your Gmail Vacation Auto Responder so your Scribe email signature displays correctly in out-of-office and automated reply messages to senders.
When configuring your [Gmail](/en/integrations/signatures/google-workspace-client-side) Vacation Auto Responder, your Scribe signature may not display correctly unless specific settings are enabled. Follow these steps to ensure your signature remains professional in your automated responses.
Click the Cog icon in the top right corner of Gmail and select "See all settings."
Scroll down to the Vacation Responder section. Enter your away message and set the duration.
Click on **"Plain text"** above the message field to enable Rich formatting. Plain Text mode will prevent your signature from displaying correctly.
Once properly configured, your auto responses will maintain your professional Scribe signature while you are away.
## Related articles
* [Is your Gmail settings correctly set up?](/en/troubleshooting/is-your-gmail-settings-correctly-set-up)
* [Signature not appearing](/en/troubleshooting/signature-not-appearing)
* [Gmail iOS app: Signature not showing up](/en/troubleshooting/gmail-ios-app-signature-not-showing-up)
# Signature not appearing
Source: https://help.scribe-mail.com/en/troubleshooting/signature-not-appearing
Fix a Scribe email signature that does not show up after installation: refresh or restart your email app to clear a cached inbox, then reach support if needed.
If your Scribe email signature does not appear in your email after [installation](/en/install-signatures), try refreshing your email provider to see the changes.
This can happen when your email client has cached the previous version of your inbox. A simple refresh or closing and reopening your email application is usually enough to load the new signature.
If your signature still does not appear after refreshing, please [contact our support team](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a) for further assistance.
## Related articles
* [Signature installation statuses and errors](/en/signature-installation-statuses-and-errors)
* [Is your Gmail settings correctly set up?](/en/troubleshooting/is-your-gmail-settings-correctly-set-up)
* [Gmail iOS app: Signature not showing up](/en/troubleshooting/gmail-ios-app-signature-not-showing-up)
# Switch to new Outlook version
Source: https://help.scribe-mail.com/en/troubleshooting/switch-to-new-outlook-version
Switch to the new Outlook version to fix Scribe signature insertion or display issues on Windows and macOS, with step-by-step toggle instructions.
If your signature is not being inserted in [Outlook](/en/integrations/signatures/microsoft-365-client-side) or is not displaying correctly, switch to the new Outlook version.
To do this, turn on the toggle switch located in the top right corner of your Outlook window.
For detailed instructions, you can watch [Microsoft's tutorial video on getting started with the new Outlook for Windows](https://support.microsoft.com/en-us/office/getting-started-with-the-new-outlook-for-windows-656bb8d9-5a60-49b2-a98b-ba7822bc7627).
## Related articles
* [Outlook add-in installation is not validating](/en/troubleshooting/outlook-add-in-installation-not-validating)
* [How to update the Scribe Microsoft add-in](/en/troubleshooting/how-to-update-the-scribe-microsoft-add-in)
* [Outlook Web add-in signatures not being installed](/en/troubleshooting/outlook-web-add-in-signatures-not-being-installed)
# Unable to install signature
Source: https://help.scribe-mail.com/en/troubleshooting/unable-to-install-signature
Troubleshoot Apple Mail signature installation issues in Scribe, including iCloud Drive settings for Mail and how to manually refresh signatures.
## If you see your Scribe signature in the list
The Scribe signature begins with "Scribe" followed by your email. If you see the signature in the list, [follow this article](/en/integrations/signatures/apple-mail) to finish the installation.
## If you do not see the Scribe signature in the list
Follow these steps to check if you are using iCloud Drive for Mail or not.
Open your system settings, open the Apple ID tab, and click on iCloud.
In the iCloud section, click on iCloud Drive.
In the next window, click on "Apps syncing to iCloud Drive."
In the next window, check if the Mail option is active.
If the Mail option is active, you can activate the option "I am using iCloud Drive for Mail" in the Scribe App. Otherwise, disable the same option in the Scribe App.
# Fix the "User Not Found on Front" error
Source: https://help.scribe-mail.com/en/troubleshooting/user-not-found
Resolve the User Not Found on Front message when Scribe cannot match a teammate to a Front user account, with steps to fix sync mappings safely.
The **"User Not Found on Front"** message means Scribe could not locate a user account with a matching email address in [Front](/en/integrations/signatures/front-client-side). Until the addresses line up, Scribe can't install that teammate's signature in Front.
## Why this happens
Scribe matches each teammate to their Front account by email address. The error is raised when:
* The teammate's email in Scribe doesn't exactly match their email in Front, usually a typo, an alias, or a different domain.
* The teammate doesn't have an active Front account.
## Resolution
Open the teammate in Scribe and check that their email matches their Front email address **exactly**: same spelling, same domain, no alias.
Fix the mismatched address in Scribe (or in Front) so both sides use the same email, then retry installing the signature.
Make sure the teammate has an active Front account associated with that email address.
If the issue persists after verifying the email addresses, please [contact our support team](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a) for assistance.
## Related articles
* [Forbidden access](/en/troubleshooting/forbidden-access)
* [Fix the user not found error for email aliases](/en/troubleshooting/fix-user-not-found-error-for-email-aliases)
* [Signature installation statuses and errors](/en/signature-installation-statuses-and-errors)
# Zoho Mail access lost
Source: https://help.scribe-mail.com/en/troubleshooting/zoho-mail-access-lost
Restore Scribe's access to your Zoho Mail organization when signatures or the teammates sync stop because the admin's authorization is no longer valid.
When Scribe can no longer reach your Zoho Mail organization, the integration shows **Access lost** and Scribe emails your workspace admins. Signatures can't be installed or updated, and the teammates sync stops, until an admin reconnects Zoho Mail.
## Why Scribe loses access
Scribe acts with the authorization the admin gave when connecting Zoho Mail. That authorization stops working when:
* the admin who connected Zoho Mail is no longer a Super Admin or Admin of the organization;
* that admin's Zoho account is deactivated or deleted;
* Scribe was removed from the connected apps of that admin's Zoho account.
## Reconnect Zoho Mail
You need a **Super Admin or Admin** account in Zoho Mail to reconnect. Invite someone from IT if you are not an admin.
In Scribe, go to Integrations and open **Zoho Mail**, under Signatures or Teammates: whichever shows **Access lost**.
Click **Connect Zoho Mail**, sign in with an admin account of the same organization, and accept the scopes. Scribe keeps your settings and, for teammates, your selection.
Once signatures are reconnected, [install your signatures](/en/install-signatures) again to bring every teammate up to date.
If both integrations show **Access lost**, reconnect each of them: teammates and signatures are connected separately.
## Related articles
* [Zoho Mail signatures](/en/integrations/signatures/zoho-mail)
* [Zoho Mail teammates](/en/integrations/teammates/zoho-mail-teammates)
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors)
# Zoho Mail signature not installed
Source: https://help.scribe-mail.com/en/troubleshooting/zoho-mail-signature-not-installed
Find out why Scribe skipped a teammate's Zoho Mail signature: the address has no active mailbox in the connected Zoho Mail organization.
When you install signatures, Scribe skips any address that has no active mailbox in the Zoho Mail organization you connected. The teammate's status stays **Not installed**, with no error: there is nowhere in Zoho Mail to put the signature.
## Why an address is skipped
* **The address is not in your Zoho Mail organization.** It belongs to another provider, or to another Zoho organization than the one connected to Scribe.
* **The mailbox is disabled**, or the user's account is deactivated, in the Zoho Mail Admin Console.
* **The address is a typo** in Scribe, or was changed in Zoho Mail after the teammate was added.
## Install the signature
In the [Zoho Mail Admin Console](https://mailadmin.zoho.com/), open Users and find the teammate. Check that the address, or the alias, matches the one in Scribe, and that the account and its mailbox are active.
If you sync teammates from Zoho Mail, click **Refresh** on the Teammates page to pick up the change. Otherwise, correct the teammate's email in Scribe.
[Install the signature](/en/install-signatures) again. The status changes to **Installed** once Zoho Mail has a mailbox for the address.
## Related articles
* [Zoho Mail signatures](/en/integrations/signatures/zoho-mail)
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors)
* [Signature not appearing](/en/troubleshooting/signature-not-appearing)
# Signature too long for Zoho Mail
Source: https://help.scribe-mail.com/en/troubleshooting/zoho-mail-signature-too-long
Fix a Zoho Mail installation that failed because the signature is longer than Zoho Mail accepts, by making the signature template lighter and reinstalling.
When a teammate's installation status says their signature "is longer than Zoho Mail accepts," Zoho Mail refused the signature because of its size. The installation shows **Failed**, and the teammate keeps the signature they had before in Zoho Mail.
Zoho Mail doesn't publish a size limit for signatures. A signature reaches it when its template holds a lot of content: many blocks, long disclaimers, or many images and links.
## Make the signature lighter
In the teammate's installation status, click **Remove some element in your signature template**. The template opens in the editor.
Remove blocks you don't need, shorten long texts such as disclaimers, and keep fewer social icons, images and links. Images are stored by Scribe and linked from the signature, so their file size doesn't count: their number does.
Publish the template, then [install the signature](/en/install-signatures) again. When Zoho Mail accepts it, the status changes from **Failed** to **Installed**.
If the signature still fails, [contact our support team](https://go.crisp.chat/chat/embed/?website_id=520828ac-2ec0-40d7-a5fd-b14c66323a7a) with the teammate's email address.
## Related articles
* [Zoho Mail signatures](/en/integrations/signatures/zoho-mail)
* [Installation statuses and errors](/en/signature-installation-statuses-and-errors)
* [Zoho Mail access lost](/en/troubleshooting/zoho-mail-access-lost)
# Why configure a sending domain?
Source: https://help.scribe-mail.com/en/why-configure-a-sending-domain
Configure a custom sending domain in Scribe to improve email deliverability, build sender reputation, and keep your signatures out of spam folders.
When you set up a signature in Scribe, it contains numerous URLs: logos, profile pictures, social icons, website links, banner images, and more.
To track clicks and conversions from your signature's marketing elements, all these URLs are shortened using Scribe's default domain: **sendassets.io**.
While this works, it's not optimal. Spam filters tend to flag emails that contain many URLs pointing to a domain different from the sender's email domain.
That's why Scribe lets you replace this default domain with a **sending domain**: a subdomain of your own company domain.
For example, if your email address is **[joe@my-company.com](mailto:joe@my-company.com)**, you can configure a sending domain like `email-signature.my-company.com` so all signature URLs match your company domain and pass spam filter checks.
***
## Benefits of a custom sending domain
Setting up a custom sending domain improves your email deliverability in three ways:
* **Avoids spam filters**: Emails with links matching the sender's domain are far less likely to be flagged as spam.
* **Builds trust**: Recipients and email security tools see consistent, branded URLs instead of a third-party domain.
* **Protects your sender reputation**: Your signature URLs are tied to your own domain rather than a shared domain used by other Scribe customers.
***
## What happens if I don't configure one?
Your signatures will continue to work using Scribe's default domain (sendassets.io). However, emails may be more likely to trigger spam filters, especially for recipients with strict email security policies.
***
## Ready to set it up?
Follow our step-by-step guide to [configure your sending domain](/en/configure-your-sending-domain).
# Workspaces
Source: https://help.scribe-mail.com/en/workspaces
Create and manage multiple workspaces in a single Scribe account to organize email signatures across clients, brands, subsidiaries, or different companies.
A workspace is a separate environment inside your Scribe account. Each workspace has its own [signatures](/en/signatures-overview), teammates, integrations, campaigns, and analytics. You can create as many workspaces as you need, all managed under a single account with centralized [billing](/en/billing).
## Why use multiple workspaces
Workspaces let you keep things organized when you manage email signatures for more than one group. Common use cases include:
* **Agencies.** Manage email signatures for multiple clients, each in their own workspace, from a single Scribe account.
* **Consultants.** Oversee email signatures for various clients without switching between separate accounts.
* **Parent companies.** Centralize signature management across different brands or subsidiary companies, all under one roof.
Each workspace can be synced with its own email provider, so different teams or clients can use different setups without interfering with each other.
## Create a workspace
Click on your workspace name in the top left corner of the sidebar. This opens a dropdown showing your existing workspaces and a **+ New Workspace** option.
Click **+ New Workspace**.
In the **New Workspace** modal, enter a name in the **Workspace name** field. The name must be between 2 and 25 characters.
Select **Yes** or **No** for the question "Do you need a signature for yourself in this new workspace?"
* If you select **No**, click **Create Workspace** to finish.
* If you select **Yes**, an additional **Your email address** field appears. Enter the email address that will be assigned to your teammate profile in this new workspace, then click **Create Workspace**.
Once created, the new workspace appears in your workspace dropdown. Click on it to switch into it at any time.
## Switch between workspaces
Click on your workspace name in the top left corner of the sidebar to open the dropdown. All your workspaces are listed there. Click on any workspace to switch to it. Each workspace has its own set of signatures, teammates, smart fields, integrations, campaigns, and analytics.
## Workspace settings
To configure a workspace, open **Workspace Settings** from the sidebar and click **Settings**. These settings apply only to the workspace you're currently in.
### Icon and name
Every workspace has an icon and a name. Click **Change Icon** to upload a new one, and edit the **Name** field to rename your workspace. The icon appears in the sidebar and helps you tell workspaces apart if you manage more than one.
### Tracking pixel
Enable this to track [analytics on banners and calls-to-action](/en/analytics-overview) in your signatures. When turned off, no tracking data is collected. Make sure you have proper consent before enabling tracking to comply with privacy regulations.
### Made with Scribe
This toggle controls whether a "Made with Scribe" watermark appears on your signatures. Removing it requires a [paid plan](/en/plans).
### Delete a workspace
The **Danger Zone** at the bottom of the settings page contains the **Delete Workspace** button. Deleting a workspace permanently removes all its data, including signatures, teammates, and settings. This action cannot be undone and is only available to the workspace Owner.
When you click **Delete Workspace**, a confirmation dialog asks you to select a reason and optionally leave a comment before proceeding.
Deleting a workspace is permanent. All signatures and teammates will be removed from Scribe servers.
## Related articles
* [Members](/en/members): invite people to a workspace and set what each one can manage.
* [Teammates overview](/en/teammates/teammates-overview): the people whose signatures live in a workspace.
* [Integrations overview](/en/integrations-overview): connect each workspace to its own email provider.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Data and privacy
Source: https://help.scribe-mail.com/en/security/data-and-privacy
Learn how Scribe handles data securely through formal data retention, disposal, and classification policies as part of SOC 2 Type II compliance.
Scribe has formal policies in place to ensure that all data is handled securely and responsibly.
## Data retention and disposal
We maintain formal retention and disposal procedures that guide the secure retention and disposal of both company and customer data. When data is no longer needed, it is removed following a documented process that meets compliance standards.
## Data classification
We enforce a data classification policy to help ensure that confidential data is properly secured and restricted to authorized personnel. This policy defines how different types of data should be handled, stored, and shared within the organization.
For more information about how we handle your data, including tracking, storage, and deletion, visit our [Data protection](/en/security/how-does-scribe-track-and-store-data) section.
All of these controls are verified as part of our SOC 2 Type II compliance process. For more details on our certifications, visit our [Trust Center](https://security.scribe-mail.com).
# Data collected overview
Source: https://help.scribe-mail.com/en/security/data-collected-overview
Scribe collects and processes certain types of data to provide its services. Here is an overview of the categories of data we handle.
## Customer personally identifiable information
Scribe collects and processes customer personally identifiable information (PII) such as names, email addresses, job titles, and phone numbers. This data is synced from your email provider (Google Workspace, Microsoft 365 or Zoho Mail) and is used to manage your workspace and generate email signatures.
## Credit card information
Scribe processes credit card information through our payment provider, Stripe. We do not store raw credit card data on our servers. All payment processing is handled securely through Stripe.
## Personal health information
Scribe does not collect or process personal health information (PHI).
For more details about how long we retain data and what data we track, see [How does Scribe track and store data](/en/security/how-does-scribe-track-and-store-data).
# BambooHR
Source: https://help.scribe-mail.com/en/security/data-collection/bamboohr
Learn what data Scribe collects when syncing your BambooHR account, including the specific fields stored and how custom reports work.
When you connect your BambooHR account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe collects and stores the following fields from BambooHR:
**User profile data:** profile picture, first name, last name, and job title.
**Phone numbers:** work phone, work phone plus extension, work phone extension, mobile phone, and home phone.
**Work details:** department, division, and location.
**Address:** address 1, address 2, city, state, zip code, and country.
**Other details:** age and date of birth.
**Social profiles:** LinkedIn URL, Facebook URL, Instagram URL, Twitter, and Pinterest.
If you configured a `report_id` when activating the integration, Scribe will only store the data included in that specific report.
Scribe has **read only** access to your BambooHR data. We cannot edit anything in your BambooHR instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Cal.com
Source: https://help.scribe-mail.com/en/security/data-collection/calcom
Learn exactly what data Scribe collects when syncing your Cal.com account, including how booking links are stored and which fields are read.
When you connect your Cal.com account to Scribe, we sync your team's booking links so you can include them in email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe stores, for each member of your Cal.com team or organization:
* The email address and username, used to match Cal.com members to your Scribe teammates
* The booking page URL and one booking URL per event type
Scribe has **read only** access to your Cal.com data. We cannot edit anything in your Cal.com account, and we never read your bookings, attendees, or availability. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Calendly
Source: https://help.scribe-mail.com/en/security/data-collection/calendly
Learn exactly what data Scribe collects when syncing your Calendly account, including how calendar URLs are stored and which fields are read.
When you connect your Calendly account to Scribe, we sync your team's scheduling links so you can include them in email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe stores one calendar URL per event type per user from your Calendly account.
Scribe has **read only** access to your Calendly data. We cannot edit anything in your Calendly instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# ChartHop
Source: https://help.scribe-mail.com/en/security/data-collection/charthop
Review the user profile fields Scribe imports when syncing your ChartHop account and how that data is stored, used, and kept secure inside the platform.
When you connect your ChartHop account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe collects and stores the following fields from ChartHop:
**User profile data:** profile picture, first name, last name, full name, and job title.
**Phone numbers:** work phone and mobile phone.
**Work details:** department name.
**Personal address:** street 1, street 2, street 3, city, state, country code, country name, and postal code.
**Work address:** street 1, street 2, street 3, city, state, country code, country name, and postal code.
Scribe has **read only** access to your ChartHop data. We cannot edit anything in your ChartHop instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Dayforce
Source: https://help.scribe-mail.com/en/security/data-collection/dayforce
Review the user profile fields Scribe imports when syncing your Dayforce HCM account and how that data is stored and used to populate signatures.
When you connect your Dayforce account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe collects and stores the following fields from Dayforce:
**User profile data:** first name, last name, and job title.
**Contact details:** mobile phone number.
**Work details:** work location.
Scribe has **read only** access to your Dayforce data. We cannot edit anything in your Dayforce instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Google Workspace Directory
Source: https://help.scribe-mail.com/en/security/data-collection/google-workspace-directory
Learn what data Scribe collects when syncing your Google Workspace Directory, including the OAuth scopes requested and the specific fields stored.
When you connect your Google Workspace Directory to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly which permissions we request and what data we store.
## OAuth Scopes
Scribe requests the following read only scopes when syncing your Google Workspace Directory:
`admin.directory.user.readonly`
This scope allows Scribe to read basic user profiles from your Google Workspace directory.
`admin.directory.orgunit.readonly`
This scope allows Scribe to read the organizational unit structure you have set up in Google Workspace.
`admin.directory.domain.readonly`
This scope allows Scribe to read the domain names associated with your Google Workspace account.
`admin.directory.userschema.readonly`
This scope allows Scribe to read any custom attributes you have created for users in Google Workspace.
`admin.directory.group.readonly`
This scope allows Scribe to read the groups you have created and their memberships.
You can find detailed information about what each scope provides access to on the [Google Admin SDK Directory API authorization page](https://developers.google.com/admin-sdk/directory/v1/guides/authorizing).
## Data Stored in Scribe
From the scopes listed above, Scribe collects and stores the following fields:
**User profile data:** profile picture, first name, surname, and job position.
**Phone numbers:** mobile phone, home phone, and work phone.
**Addresses:** home address, work address, and other address.
**Organization structure:** organizational unit names and memberships.
**Groups:** group names and memberships.
**Domains:** domain hostnames.
**Custom attributes:** any custom attribute values you have created in Google Workspace.
Scribe has **read only** access to all user, organizational unit, group, and domain data. We cannot edit anything in your Google Workspace or read your emails. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Google Workspace Gmail
Source: https://help.scribe-mail.com/en/security/data-collection/google-workspace-gmail
Learn what permissions Scribe requests when connecting to Google Workspace Gmail, including the OAuth scopes used to install and uninstall email signatures.
When you connect Scribe to Google Workspace Gmail, we use a Google Workspace Marketplace app to install and uninstall email signatures for your team. This page explains exactly which permissions we request.
## OAuth Scopes
The Scribe Google Workspace Marketplace app requests the following scopes:
`gmail.settings.basic`
This scope allows Scribe to set and remove email signatures on your teammates' primary email addresses.
`gmail.settings.sharing`
This scope allows Scribe to set and remove email signatures on alias email addresses associated with your teammates' accounts.
You can find detailed information about what each scope provides access to on the [Gmail API authorization scopes page](https://developers.google.com/gmail/api/auth/scopes).
With these scopes, Scribe **cannot read your emails**. We only use them to manage email signatures. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Lucca
Source: https://help.scribe-mail.com/en/security/data-collection/lucca
Review the user profile fields Scribe imports when syncing your Lucca HR account and how that data is stored and used to populate teammate signatures.
When you connect your Lucca account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe collects and stores the following fields from Lucca:
**User profile data:** first name, last name, civil title, and job title.
**Contact details:** direct line and professional mobile.
**Work details:** department name and legal entity name.
**Address:** address.
Scribe has **read only** access to your Lucca data. We cannot edit anything in your Lucca instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Microsoft Entra ID
Source: https://help.scribe-mail.com/en/security/data-collection/microsoft-entra-id
Learn what data Scribe collects when syncing your Microsoft Entra ID, including the OAuth scopes requested and the specific fields stored.
When you connect your Microsoft Entra ID to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly which permissions we request and what data we store.
## OAuth Scopes
Scribe requests the following scopes when syncing your Microsoft Entra ID:
`openid` (Delegated), `profile` (Delegated), `email` (Delegated)
These scopes give Scribe read access to a user's basic profile, including their name and email address, so your teammates can sign in to Scribe with their Office 365 account.
`AdministrativeUnit.Read.All` (Application)
This scope allows Scribe to read administrative units in your directory so we can create matching departments in Scribe.
`Domain.Read.All` (Application)
This scope allows Scribe to read the domain names associated with your Microsoft 365 account so we can import them into Scribe.
`User.Read` (Delegated)
This scope allows the signed in user to read their own profile.
`User.Read.All` (Application)
This scope allows Scribe to read the full profile of every user in your directory.
`GroupMember.Read.All` (Application)
This scope allows Scribe to read which users belong to which groups.
`Group.Read.All` (Application)
This scope allows Scribe to read the groups you have created in your directory.
`offline_access` (Delegated)
This scope allows Scribe to maintain access to the data you have authorized without requiring you to sign in again each time.
All scopes listed above use the Microsoft Graph API (`https://graph.microsoft.com/`). You can find detailed information about Microsoft Graph permissions in the [Microsoft Graph permissions reference](https://learn.microsoft.com/en-us/graph/permissions-reference).
## Data Stored in Scribe
From the scopes listed above, Scribe collects and stores the following fields:
**User profile data:** profile picture, first name, last name, and job position.
**Phone numbers:** mobile phone, work phone, and fax.
**Work details:** department and office.
**Address:** street address, city, state or province, zip or postal code, and country or region.
**Groups:** group names and memberships.
**Administrative units:** administrative unit names and memberships.
**Domains:** domain hostnames.
Scribe has **read only** access to your directory data. We cannot edit anything in your Microsoft 365 or read your emails. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Okta
Source: https://help.scribe-mail.com/en/security/data-collection/okta
Review the user profile fields Scribe imports when syncing your Okta directory and how that data is stored and used to populate teammate email signatures.
When you connect your Okta account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe collects and stores the following fields from Okta:
**User profile data:** first name, last name, middle name, honorific prefix, honorific suffix, title, display name, and nickname.
**Contact details:** secondary email, mobile phone, and primary phone.
**Address:** street address, city, state, zip code, country code, and postal address.
**Work details:** employee number, cost center, organization, division, department, and manager.
Scribe has **read only** access to your Okta data. We cannot edit anything in your Okta instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Outreach
Source: https://help.scribe-mail.com/en/security/data-collection/outreach
Learn what data Scribe collects when syncing your Outreach account, including the specific user profile fields and custom attributes stored.
When you connect your Outreach account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe collects and stores the following fields from Outreach:
**User profile data:** first name, last name, and title.
**Contact details:** phone.
**Custom attributes:** custom attribute 1, custom attribute 2, custom attribute 3, custom attribute 4, and custom attribute 5.
Scribe has **read only** access to your Outreach data. We cannot edit anything in your Outreach instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# PayFit
Source: https://help.scribe-mail.com/en/security/data-collection/payfit
Review the user profile fields Scribe imports when syncing your PayFit account and how that data is stored and used to populate teammate email signatures.
When you connect your PayFit account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe collects and stores the following fields from PayFit:
**User profile data:** birth date and job title.
**Contact details:** work email and work phone number.
**Work location:** address, city, zip, and country.
Scribe has **read only** access to your PayFit data. We cannot edit anything in your PayFit instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Pingboard
Source: https://help.scribe-mail.com/en/security/data-collection/pingboard
Learn what data Scribe collects when syncing your Pingboard account, including standard profile fields and how custom fields are imported and stored.
When you connect your Pingboard account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe imports all custom fields from your Pingboard account. You can find the full list of available custom fields in the [Pingboard API documentation](https://pingboard.docs.apiary.io/#reference/custom-fields/custom-fields-collection/get-custom-fields).
Scribe has **read only** access to your Pingboard data. We cannot edit anything in your Pingboard instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Rippling
Source: https://help.scribe-mail.com/en/security/data-collection/rippling
Review the user profile fields Scribe imports when syncing your Rippling account and how that data is stored and used to populate teammate signatures.
When you connect your Rippling account to Scribe, we sync your team's information so you can manage email signatures across your organization. This page explains exactly what data we store.
## Data Stored in Scribe
Scribe collects and stores the following fields from Rippling:
**User profile data:** first name, last name, full name, and job title.
**Contact details:** work email.
**Work location:** street, city, state, zip, country code, phone, and nickname.
Scribe has **read only** access to your Rippling data. We cannot edit anything in your Rippling instance. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Zoho Mail
Source: https://help.scribe-mail.com/en/security/data-collection/zoho-mail
Learn what data Scribe collects when you connect Zoho Mail for teammates and signatures, including the OAuth scopes requested and the specific fields stored.
When you connect Zoho Mail to Scribe, we sync your team's information and install your teammates' email signatures. Teammates and signatures are two separate integrations, each with its own consent. This page explains exactly which permissions we request and what data we store.
## OAuth Scopes for teammates
Scribe requests the following read only scopes when syncing your teammates from Zoho Mail:
`ZohoMail.accounts.READ`
This scope allows Scribe to read the connecting admin's own account: their role, their email address and the organization's ID.
`ZohoMail.organization.accounts.READ`
This scope allows Scribe to read the users of your Zoho Mail organization, with their aliases and profile fields.
`ZohoMail.organization.groups.READ`
This scope allows Scribe to read the groups you have created and their members.
`ZohoMail.organization.domains.READ`
This scope allows Scribe to read the domain names of your Zoho Mail organization.
## OAuth Scopes for signatures
Scribe requests the following scopes when installing signatures in Zoho Mail:
`ZohoMail.accounts.READ`
This scope allows Scribe to check that the connecting admin is an admin of the organization, and to read the organization's ID.
`ZohoMail.organization.accounts.READ`
This scope allows Scribe to find the Zoho Mail user behind each teammate's address and read the signatures Scribe installed for them.
`ZohoMail.organization.accounts.CREATE`, `ZohoMail.organization.accounts.UPDATE`, `ZohoMail.organization.accounts.DELETE`
These scopes allow Scribe to add, update and remove your teammates' signatures. Zoho Mail has no permission for signatures alone, so these scopes also cover managing user accounts. Scribe uses them only for signatures: it never creates, edits or deletes a user.
You can find detailed information about the [scopes Scribe uses from Zoho Mail](/en/security/scopes-used-from-zoho-mail) and in the [Zoho Mail API documentation](https://www.zoho.com/mail/help/api/).
## Data Stored in Scribe
From the scopes listed above, Scribe collects and stores the following fields:
**User profile data:** first name, last name, and job position and department when Zoho fills them.
**Email addresses:** each teammate's address and, if you import them, their confirmed aliases.
**Phone numbers:** mobile phone and work phone.
**Address:** street address, city, state or province, zip or postal code, and country.
**Groups:** group names and memberships.
**Domains:** domain hostnames.
**Custom information:** the values of the custom information fields you have created in Zoho Mail.
**Signatures:** for each signature installed, the ID Zoho Mail gives it.
**Connection:** your Zoho data center, your organization's ID and the authorization from your consent.
Scribe **cannot read or send your emails**, and doesn't store any profile picture from Zoho Mail. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Data subject request form
Source: https://help.scribe-mail.com/en/security/data-subject-request-form
Find out how to submit a data subject request to Scribe and reach our Data Protection Officer for any privacy or GDPR-related inquiries.
Protecting your privacy and security is central to our mission at Scribe. Our team works tirelessly to ensure that your data is safeguarded to the highest standards. As part of our commitment, we adhere to privacy laws, including [GDPR](/en/security/how-does-scribe-comply-with-gdpr).
We have a dedicated Data Protection Officer on hand to assist with any inquiries or concerns you might have about your data. You can reach out to us via the chat or by sending an email to [privacy@scribe-mail.com](mailto:privacy@scribe-mail.com).
If necessary, you can download and complete the [data subject request form](https://static-cdn.scribe-mail.com/documents/data-subject-request-form.pdf).
## Related articles
* [Data and privacy](/en/security/data-and-privacy)
* [How do I delete my workspace data?](/en/security/how-do-i-delete-my-workspace-data)
* [How does Scribe track and store data?](/en/security/how-does-scribe-track-and-store-data)
# How do I configure 2FA in Scribe?
Source: https://help.scribe-mail.com/en/security/how-do-i-configure-2fa-in-scribe
Learn how to enable two-factor authentication (2FA) for your Scribe account, either through your email provider or as a paid add-on.
## What is 2FA?
2FA, or Two Factor Authentication, adds an extra layer of security to [your account](/en/account). Normally, you use a password (the first "factor") to access your online accounts. With 2FA, after entering your password, you are asked for a second piece of information, like a code sent to your phone. This means even if someone knows your password, they would still need that second piece of information to get in, making your accounts much more secure.
## How does it work?
You have two options to enable 2FA for your Scribe account.
**Option 1: Through your email provider**
Activate the 2FA option in your email provider (either Google Workspace or Microsoft 365). When your teammates log in to Scribe using Google or Microsoft 365 authentication, they will be prompted to enter the 2FA code.
**Option 2: As a paid add on**
2FA can be purchased as a paid add on directly in Scribe. Contact us on our chat if you would like to activate it.
## Related articles
* [How do I configure SSO/SAML in Scribe?](/en/security/how-do-i-configure-sso-saml-in-scribe)
* [What Scribe does concerning security](/en/what-scribe-does-concerning-security)
* [Sign in and sign up](/en/sign-in-and-sign-up)
# How do I configure SSO/SAML in Scribe?
Source: https://help.scribe-mail.com/en/security/how-do-i-configure-sso-saml-in-scribe
Set up Single Sign-On (SAML or OIDC) in Scribe with Okta, Microsoft Entra ID, Google Workspace or any compatible identity provider: add your domain, verify it, and connect your IdP.
## What is SSO/SAML?
SSO, which stands for Single Sign On, is a convenient way of logging into multiple services or platforms using just one set of credentials. Instead of remembering a different username and password for every website or app you use, you just use one combination to access them all.
SAML is the technology behind the scenes that makes this seamless process possible. Think of it like having a universal key that opens multiple locks, ensuring that your access is both simple and secure.
**SSO controls who can sign in to the Scribe dashboard.** It does not import employee data into your signatures. To pull job titles, departments or phone numbers from your identity provider, connect it as a [Smart Fields data source](/en/smart-fields) as well. The [Okta integration](/en/integrations/smart-fields/okta-smart-fields) is one example.
## Before you start
You will need:
* A **paid Scribe subscription**. The SSO add-on cannot be purchased on its own.
* The **Single Sign-On add-on**: **$150 per month**, or **$120 per month billed yearly**. Available on any paid plan.
* The **Owner or Admin** role in your Scribe workspace.
* Access to your **domain's DNS settings** (to verify domain ownership).
* **Admin access to your identity provider**: Okta, Microsoft Entra ID, Google Workspace, OneLogin, or any SAML/OIDC-compatible IdP.
## Activate the add-on
In your Scribe dashboard, go to **Settings → Security → Single Sign-On**.
Click **Subscribe for \$150/month** and confirm. The add-on is applied to your existing subscription immediately.
If you are still on a free plan or a trial, Scribe will prompt you to choose a paid plan first.
## Configure SSO
Once the add-on is active, Scribe walks you through a three-step setup.
Enter the email domain your team signs in with, for example `your-company.com`, and click **Continue**.
This is the domain Scribe matches against when someone types their email on the login page. Use the domain in your teammates' email addresses, not a subdomain.
Click **Start verification**. Scribe opens a guided wizard that adds the required `TXT` record to your DNS automatically for most providers, with no developer or manual DNS editing needed.
If your provider isn't supported by the wizard, it shows you the exact record to add by hand.
The domain's status is shown as a badge in the domains table:
| Status | Meaning |
| - | - |
| **Pending** | Verification has started, DNS is still propagating |
| **Verified** | Ownership confirmed. You can move on |
| **Not Verified** | The record hasn't been detected yet |
| **Failed** | Verification could not be completed. Check the DNS record and start again |
DNS propagation is usually quick, but it can take up to 24 hours. Scribe moves you to the next step automatically once the domain is verified.
Click **Configure SSO**. You are redirected to a secure setup portal where you pick your identity provider (Okta, Microsoft Entra ID, Google Workspace, OneLogin, or a generic SAML/OIDC connection) and follow the provider-specific instructions.
The portal tells you exactly which values to copy into your IdP (such as the ACS URL and Entity ID for SAML) and which values to copy back.
When you're done, you are returned to **Settings → Security → Single Sign-On** in Scribe. SSO becomes active as soon as your identity provider marks the connection as active.
## How your team signs in afterwards
On the [login page](https://app.scribe-mail.com/login), a teammate types their email address. If the domain matches a verified SSO domain and your connection is active, Scribe shows **Single sign-on detected** and replaces the password field with a **Log-in with SSO** button. Clicking it sends them to your identity provider to authenticate.
Teammates whose email domain is not covered by an SSO domain keep signing in as before, with email and password, Google, or Microsoft 365.
## Managing your domains
Once SSO is configured, **Settings → Security → Single Sign-On** lists every sign-in domain with its verification status.
* **Add a domain**: click **Add Domain** to cover an additional email domain (useful after a rebrand or an acquisition). Each new domain has to be verified the same way.
* **Delete a domain**: click the bin icon. You cannot delete your last remaining domain.
## If you cancel the add-on
Removing the SSO add-on, or cancelling your subscription, deletes the SSO connection and deactivates SSO for your workspace. Your teammates fall back to email and password, Google, or Microsoft 365 sign-in. Your domains stay listed, so re-subscribing only requires reconnecting your identity provider.
## Related articles
* [How do I configure 2FA in Scribe?](/en/security/how-do-i-configure-2fa-in-scribe)
* [Okta Smart Fields](/en/integrations/smart-fields/okta-smart-fields): sync job titles and other profile data from Okta into your signatures.
* [Members](/en/members)
* [What Scribe does concerning security](/en/what-scribe-does-concerning-security)
# How do I delete my workspace data?
Source: https://help.scribe-mail.com/en/security/how-do-i-delete-my-workspace-data
Follow these steps to permanently delete your Scribe workspace, remove all associated teammate data, and erase your information from our systems.
Protecting your rights to your data is critical to our mission at Scribe. This article will walk you through the process of [deleting your workspace](/en/workspaces) and all associated data.
> **Warning:** This action is irreversible and will delete all of your data. If you have any data you need to keep, make sure to export any necessary data before deleting your workspace.
## Steps to delete your workspace
1. Click on your workspace icon
2. Click on Settings
3. In the workspace section, click on "Settings"
4. Click on "Delete entire workspace"
Once you confirm, your workspace is marked for deletion and all associated data is removed from our systems within a few hours.
## Related articles
* [Data and privacy](/en/security/data-and-privacy)
* [How does Scribe track and store data?](/en/security/how-does-scribe-track-and-store-data)
* [Data subject request form](/en/security/data-subject-request-form)
# How does Scribe comply with GDPR?
Source: https://help.scribe-mail.com/en/security/how-does-scribe-comply-with-gdpr
Learn how Scribe prepared for and complies with the EU General Data Protection Regulation (GDPR), including the key steps we took.
At Scribe, we diligently prepared for the EU General Data Protection Regulation (GDPR) to ensure we meet its requirements and maintain transparency about how we handle data.
## An overview of GDPR and Scribe's preparation
**What is GDPR?**
The GDPR is a comprehensive data protection regulation that became effective on May 25, 2018. It superseded previous EU laws to bolster the protection of "personal data" and individuals' rights. It establishes a unified set of rules governing the processing and monitoring of EU data.
**Does it affect me?**
Most likely, yes. If you hold or process the data of any individual in the EU, the GDPR applies to you, regardless of whether you are based in the EU.
**How Scribe prepared for GDPR**
Our teams dedicated significant effort to ensure GDPR compliance. This involved a major overhaul of processes and data models to meet our legal responsibilities, serve our customers effectively, and allow for agility and scalability in our product development.
## Key steps we took
**Updating our Data Processing Agreements (DPAs)**
Meeting GDPR's strong data protection expectations was paramount. Our revised data processing agreement outlines our privacy commitments and defines the terms under which Scribe and our customers can achieve GDPR compliance. Customers can request and sign this document as needed.
**Appointing a Data Protection Officer**
We designated a Data Protection Officer to guide and oversee our data management practices. You can reach them at [privacy@scribe-mail.com](mailto:privacy@scribe-mail.com).
**Coordinating with vendors**
We conducted a thorough review of our vendors to understand their stance on GDPR and executed [Data Processing Agreements](/en/security/subprocessors) with them.
**Implementing new security protocols**
Security remains a top priority for Scribe. We undergo regular external audits and penetration tests, and have established a stringent security framework. This framework has met international compliance standards like [SOC 2](/en/what-scribe-does-concerning-security). We also refined our internal access structures to ensure data access is limited to authorized personnel.
**Achieving self certification under GDPR**
In collaboration with our partner Secureframe, we continuously monitor our infrastructure to ensure persistent GDPR compliance. We have successfully completed all verification tests and provided the necessary evidence of compliance.
## Related articles
* [Data and privacy](/en/security/data-and-privacy)
* [How does Scribe track and store data?](/en/security/how-does-scribe-track-and-store-data)
* [Data subject request form](/en/security/data-subject-request-form)
# How does Scribe track and store data?
Source: https://help.scribe-mail.com/en/security/how-does-scribe-track-and-store-data
Learn what data Scribe tracks when signatures are opened or clicked, how long it is retained, and how IP addresses are anonymized for GDPR compliance.
When you install your Scribe signature, we begin tracking signature openings and clicks. If you wish to opt out of this automatic tracking, you can do so from your [workspace settings](/en/workspaces) page.
We anonymize IP addresses, ensuring that we never store the raw IP addresses of your recipients.
## Data expiration practices
To comply with the EU [General Data Protection Regulation (GDPR)](/en/security/how-does-scribe-comply-with-gdpr), we automatically delete data that we no longer need or have a use for.
**Free plan:** Tracking data is retained for 30 days.
**Paid plan:** Tracking data is retained for 1 year.
**Workspace data** (like teammates) is retained until your workspace is deleted or if your workspace remains inactive for 6 months.
## How we track data
Below is a comprehensive list of the data we track.
**Standard data tracked**
We automatically collect the following information each time a signature is opened or a link is clicked:
* IP (anonymized)
* Country (determined from IP before anonymization)
* Client name (for example, Chrome or Apple Mail)
* Client version
* Device type (for example, mobile, tablet, or laptop)
**Customizable data syncing**
You have the autonomy to select which [data you want to sync](/en/smart-fields) from your email provider to Scribe. By default, we sync mandatory details like email, along with first name, last name, and job position. You can adjust these settings in your workspace configuration.
## Related articles
* [Data and privacy](/en/security/data-and-privacy)
* [Data collected overview](/en/security/data-collected-overview)
* [How do I delete my workspace data?](/en/security/how-do-i-delete-my-workspace-data)
# Infrastructure security
Source: https://help.scribe-mail.com/en/security/infrastructure-security
Learn how Scribe protects your data with access controls, authentication, monitoring, logging, and network protection as part of SOC 2 Type II compliance.
Scribe takes infrastructure security seriously. We implement strict controls to ensure that only authorized users can access our systems, networks, and data. Below is an overview of the measures we have in place.
## Access control
We restrict privileged access to all critical systems, including databases, firewalls, operating systems, and the production network. Only authorized users with a verified business need can access these resources.
Access to our production applications is limited strictly to authorized personnel. This ensures that no unauthorized individual can interact with live systems or customer data.
## Authentication
All access to systems and applications requires unique credentials. We enforce the use of unique usernames combined with passwords or authorized Secure Socket Shell (SSH) keys. This applies to both application access and production network authentication.
Remote access to our production systems is only available through an approved encrypted connection, ensuring that data remains protected even when accessed from outside the office.
## Monitoring and logging
We use a log management tool to identify events that may impact our ability to achieve security objectives. This helps us detect and respond to potential threats quickly.
An infrastructure monitoring tool is also in place. It watches over our systems, infrastructure, and performance around the clock and generates alerts when specific predefined thresholds are met.
## Network protection
Scribe uses firewalls configured to prevent unauthorized access. Our network and system hardening standards are documented, based on industry best practices, and reviewed at least annually to ensure they stay current.
All of these controls are verified as part of our [SOC 2 Type II compliance process](/en/what-scribe-does-concerning-security). For more details on our certifications, visit our [Trust Center](https://security.scribe-mail.com).
## Related articles
* [Product security](/en/security/product-security)
* [Organizational security](/en/security/organizational-security)
* [Internal security procedures](/en/security/internal-security-procedures)
# Internal security procedures
Source: https://help.scribe-mail.com/en/security/internal-security-procedures
Scribe's internal security procedures cover business continuity, disaster recovery, configuration management, incident response, and risk management.
Scribe follows rigorous internal procedures to ensure security is maintained across the organization. Here is a summary of the key processes we have in place.
## Business continuity and disaster recovery
We have Business Continuity and Disaster Recovery Plans that outline communication strategies designed to maintain information security continuity in the event of the unavailability of key personnel.
## Configuration management
A configuration management procedure ensures that system configurations are deployed consistently throughout our environment. This reduces the risk of misconfiguration and keeps all systems aligned with our security standards.
## Development lifecycle
Scribe follows a formal systems development life cycle (SDLC) methodology. This governs the development, acquisition, implementation, changes (including emergency changes), and maintenance of information systems and related technology requirements.
## Roles and responsibilities
Company management has established clearly defined roles and responsibilities to oversee the design and implementation of information security controls. Everyone on the team knows their role in keeping your data safe.
## Incident response
We have security and privacy incident response policies and procedures that are documented and communicated to all authorized users. If something goes wrong, we have a plan in place to respond quickly and effectively.
## Physical access controls
We maintain processes for granting, changing, and terminating physical access to company data centers. All physical access is based on authorization from control owners. Access to data centers is reviewed at least annually to ensure it remains appropriate.
## Risk management
Scribe has a documented risk management program that includes guidance on identifying potential threats, rating the significance of associated risks, and defining mitigation strategies for those risks.
All of these controls are verified as part of our [SOC 2 Type II compliance process](/en/what-scribe-does-concerning-security). For more details on our certifications, visit our [Trust Center](https://security.scribe-mail.com).
## Related articles
* [Infrastructure security](/en/security/infrastructure-security)
* [Organizational security](/en/security/organizational-security)
* [Product security](/en/security/product-security)
# Organizational security
Source: https://help.scribe-mail.com/en/security/organizational-security
How Scribe enforces organizational security through employee policies, device management, and asset disposal procedures under SOC 2 Type II compliance.
Scribe maintains strong organizational security practices to protect both company and customer data. Here is an overview of the key controls we have in place.
## Employee policies
Every employee is required to acknowledge a code of conduct at the time of hire. Employees who violate the code of conduct are subject to disciplinary actions in accordance with our disciplinary policy.
We enforce a strict password policy. All passwords for systems and applications within our scope must be configured according to company standards.
## Device management
Scribe deploys anti malware technology to environments commonly susceptible to malicious attacks. This technology is configured to update routinely, generate logs, and stay installed on all relevant systems.
We also use a mobile device management (MDM) system to centrally manage mobile devices that support our service. This allows us to enforce security policies across all company devices.
## Asset disposal
We follow strict procedures for disposing of electronic media that contains confidential information. All media is purged or destroyed in accordance with best practices, and certificates of destruction are issued for each device destroyed.
All of these controls are verified as part of our [SOC 2 Type II compliance process](/en/what-scribe-does-concerning-security). For more details on our certifications, visit our [Trust Center](https://security.scribe-mail.com).
## Related articles
* [Infrastructure security](/en/security/infrastructure-security)
* [Product security](/en/security/product-security)
* [Internal security procedures](/en/security/internal-security-procedures)
# Product security
Source: https://help.scribe-mail.com/en/security/product-security
How Scribe protects product security with control self assessments, encryption in transit, and vulnerability monitoring under SOC 2 Type II compliance.
Scribe is committed to delivering a secure product. We perform regular assessments and enforce encryption standards to protect your data at every stage.
## Control self assessments
We perform control self assessments at least annually to ensure that all security controls are in place and operating effectively. When findings are identified, corrective actions are taken promptly. If we have committed to an SLA for a specific finding, the corrective action is completed within that timeframe.
## Data encryption in transit
Scribe uses secure data transmission protocols to encrypt all confidential and sensitive data when it is transmitted over public networks. This ensures your information stays protected while moving between systems.
## Vulnerability and system monitoring
We have formal policies that outline the requirements for vulnerability management and system monitoring. These policies are reviewed regularly to ensure they align with current best practices.
All of these controls are verified as part of our [SOC 2 Type II compliance process](/en/what-scribe-does-concerning-security). For more details on our certifications, visit our [Trust Center](https://security.scribe-mail.com).
## Related articles
* [Infrastructure security](/en/security/infrastructure-security)
* [Organizational security](/en/security/organizational-security)
* [Internal security procedures](/en/security/internal-security-procedures)
# Scopes used from Google Workspace
Source: https://help.scribe-mail.com/en/security/scopes-used-from-google-workspace
Review the OAuth scopes Scribe requests when syncing your Google Workspace Directory and the specific data we store from each one.
Here are the scopes we request when syncing your Google Workspace Directory with Scribe. Each scope is necessary for a specific function within the product.
## Sync your teammates
This scope allows Scribe to read user information from your Google Workspace directory.
* `admin.directory.user.readonly`
## Sync your organizational units
This scope lets Scribe read your organizational units so they can be reflected in your Scribe workspace.
* `admin.directory.orgunit.readonly`
## Sync your domains
This scope allows Scribe to read your domains and import them.
* `admin.directory.domain.readonly`
## Sync user custom attributes
This scope lets Scribe read custom attributes you have created in Google Workspace so they can be used in your email signatures.
* `admin.directory.userschema.readonly`
## Sync your groups
This scope allows Scribe to read your Google Workspace groups.
* `admin.directory.group.readonly`
You can learn more about what each scope gives access to on the [Google Admin SDK Directory API documentation](https://developers.google.com/admin-sdk/directory/v1/guides/authorizing).
## What data we store in Scribe
From the scopes listed above, here is the data we actually store in Scribe:
* Profile picture
* First name
* Surname
* Job position
* Mobile phone
* Home phone
* Work phone
* Home address
* Work address
* Other address
* Organization unit
* Custom attributes values
* Group names and memberships
* Organization unit names and memberships
* Domains hostname
> **Note:** Scribe has read only access to all user, organizational unit, group, and domain data. We cannot edit data in your Google Workspace or read your emails. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Scopes used from Microsoft Entra ID
Source: https://help.scribe-mail.com/en/security/scopes-used-from-microsoft-entra-id
Review the OAuth scopes Scribe requests when syncing Microsoft Entra ID, the data we store from each one, and why each permission is needed.
Here are the scopes we request when syncing your Microsoft Entra ID with Scribe. Each scope is necessary for a specific function within the product.
## Authentication and user profile
These scopes allow your coworkers to log in to Scribe with their Office 365 account. They provide read access to basic user profile information such as name and email.
* `https://graph.microsoft.com/openid` (Delegated)
* `https://graph.microsoft.com/profile` (Delegated)
* `https://graph.microsoft.com/email` (Delegated)
## Administrative units
This scope lets Scribe read administrative units from your directory so we can create departments in Scribe.
* `https://graph.microsoft.com/AdministrativeUnit.Read.All` (Application)
## Domains
This scope allows Scribe to read your domains and import them into your Scribe workspace.
* `https://graph.microsoft.com/Domain.Read.All` (Application)
## Sign in and read user profile
This scope enables users to sign in and provides basic profile reading capabilities.
* `https://graph.microsoft.com/User.Read` (Delegated)
## Read all users' full profiles
This scope is required to sync all user profiles from your directory into Scribe.
* `https://graph.microsoft.com/User.Read.All` (Application)
## Read all groups
This scope lets Scribe read group memberships from your directory.
* `https://graph.microsoft.com/GroupMember.Read.All` (Application)
## Read all group memberships
This scope provides access to read all group information.
* `https://graph.microsoft.com/Group.Read.All` (Application)
## Maintain access to data
This scope ensures that Scribe can maintain continuous access to the data you have authorized, without requiring you to re authenticate frequently.
* `https://graph.microsoft.com/offline_access` (Delegated)
## What data we store in Scribe
From the scopes listed above, here is the data we actually store in Scribe:
* Profile picture
* First name
* Last name
* Job position
* Mobile phone
* Work phone
* Fax
* Department
* Office
* Street address
* City
* State or province
* Zip or postal code
* Country or region
* Group names and memberships
* Administrative unit names and memberships
* Domains hostname
> **Note:** Scribe only reads data. We cannot edit data in your Microsoft 365 or read your emails. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Scopes used from Zoho Mail
Source: https://help.scribe-mail.com/en/security/scopes-used-from-zoho-mail
Review the OAuth scopes Scribe requests when syncing teammates from Zoho Mail and installing signatures in Zoho Mail, and the data we store from each one.
Here are the scopes we request when you connect Zoho Mail to Scribe. Teammates and signatures are two separate integrations, each with its own consent, so you only grant what you use. Each scope is necessary for a specific function within the product.
## Sync your teammates
These scopes are read only. With them, Scribe changes nothing in your Zoho Mail organization.
### Check who connects Zoho Mail
This scope lets Scribe read the account of the admin who connects Zoho Mail: their role, to check that they are an admin of the organization, their email address, and the organization's ID.
* `ZohoMail.accounts.READ`
### Sync your teammates
This scope allows Scribe to read the users of your Zoho Mail organization, with their aliases and profile fields.
* `ZohoMail.organization.accounts.READ`
### Sync your groups
This scope allows Scribe to read your Zoho Mail groups and their members, so you can select teammates by group.
* `ZohoMail.organization.groups.READ`
### Sync your domains
This scope allows Scribe to read your domains and import them.
* `ZohoMail.organization.domains.READ`
## Install signatures
### Check who connects Zoho Mail
As for teammates, this scope lets Scribe check that the admin who connects Zoho Mail is an admin of the organization, and read the organization's ID.
* `ZohoMail.accounts.READ`
### Find each teammate's mailbox
This scope lets Scribe find the Zoho Mail user behind each teammate's address, and read the signatures Scribe installed for them.
* `ZohoMail.organization.accounts.READ`
### Add, update and remove signatures
These scopes let Scribe add a teammate's signature, update it when you publish a change, and remove it.
* `ZohoMail.organization.accounts.CREATE`
* `ZohoMail.organization.accounts.UPDATE`
* `ZohoMail.organization.accounts.DELETE`
**Zoho Mail has no permission for signatures alone.** Signatures are part of Zoho's organization accounts API, so Zoho's consent screen asks you to let Scribe create, update and delete your organization's accounts. Scribe uses these scopes only to add, update and remove signatures: it never creates, edits or deletes a user, and never changes a password or a role.
You can learn more about what each scope gives access to in the [Zoho Mail API documentation](https://www.zoho.com/mail/help/api/).
## What data we store in Scribe
From the scopes listed above, here is the data we actually store in Scribe:
* First name
* Last name
* Email address and aliases
* Mobile phone
* Work phone
* Street address
* City
* State or province
* Zip or postal code
* Country or region
* Job position and department, when Zoho fills them
* Custom information values
* Group names and memberships
* Domains hostname
* For each installed signature, the ID Zoho Mail gives it
* The connection itself: your Zoho data center, your organization's ID and the authorization from your consent
> **Note:** Scribe can't read or send your emails, and doesn't store any profile picture from Zoho Mail. Scribe is [SOC 2 Type II compliant](/en/what-scribe-does-concerning-security).
# Status page
Source: https://help.scribe-mail.com/en/security/status-page
Monitor Scribe's real-time availability and performance, view historical uptime data, and subscribe to service disruption notifications.
You can monitor the availability and performance of Scribe at any time by visiting our [Status Page](https://status.scribe-mail.com/).
The Status Page shows real-time uptime information and historical data so you can check whether all systems are running smoothly. You can also subscribe to receive notifications when there is a service disruption or planned maintenance.
## Related articles
* [What Scribe does concerning security](/en/what-scribe-does-concerning-security)
* [Infrastructure security](/en/security/infrastructure-security)
* [Subprocessors](/en/security/subprocessors)
# Subprocessors
Source: https://help.scribe-mail.com/en/security/subprocessors
View the full list of trusted third-party subprocessors Scribe uses to deliver its services, along with their purpose, location, and DPAs.
Scribe works with a number of trusted third-party subprocessors to deliver its services. On the link below is the full list of subprocessors we use, along with their purpose and location:
[https://security.scribe-mail.com/](https://security.scribe-mail.com/)
We review our subprocessors regularly to ensure they meet our security and compliance standards. All subprocessors have signed Data Processing Agreements (DPAs) in line with [GDPR requirements](/en/security/how-does-scribe-comply-with-gdpr).
If you have any questions about our subprocessors, feel free to reach out to us via our chat or by emailing [privacy@scribe-mail.com](mailto:privacy@scribe-mail.com).
## Related articles
* [Data collected overview](/en/security/data-collected-overview)
* [Data and privacy](/en/security/data-and-privacy)
* [What Scribe does concerning security](/en/what-scribe-does-concerning-security)
# What Scribe does concerning security
Source: https://help.scribe-mail.com/en/what-scribe-does-concerning-security
How Scribe protects your data with SOC 2 Type II and GDPR compliance, plus enterprise-grade infrastructure, product, and organizational security controls.
Security is built into the fabric of our products, team, infrastructure, and processes, so you can rest assured your data is safeguarded.
Scribe is SOC 2 Type II compliant as well as GDPR compliant. If you wish to consult our certification, contact us to sign an NDA beforehand.
You can also visit our [Trust Center](https://security.scribe-mail.com), where we share our compliance status across common frameworks like SOC 2, ISO 27001, and GDPR. The Trust Center also includes a full list of our published policies and controls.
Learn more about our security practices in the following articles:
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.
# Signature clicks (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-clicks-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/clicks
# Signature views (timeseries or breakdown)
Source: https://help.scribe-mail.com/api-reference/analytics/signature-views-timeseries-or-breakdown
/api-reference/openapi.json get /v1/analytics/views
# Create an asset
Source: https://help.scribe-mail.com/api-reference/assets/create-an-asset
/api-reference/openapi.json post /v1/assets
# Delete an asset
Source: https://help.scribe-mail.com/api-reference/assets/delete-an-asset
/api-reference/openapi.json delete /v1/assets/{id}
# List assets
Source: https://help.scribe-mail.com/api-reference/assets/list-assets
/api-reference/openapi.json get /v1/assets
# Update an asset
Source: https://help.scribe-mail.com/api-reference/assets/update-an-asset
/api-reference/openapi.json patch /v1/assets/{id}
# Scribe API authentication: API keys and scopes
Source: https://help.scribe-mail.com/api-reference/authentication
Authenticate Scribe API requests with a workspace API key sent as a Bearer token. Create keys, scope them to resources, and keep them secure.
The Scribe API authenticates every request with an API key, sent as a Bearer token in the `Authorization` header:
```text theme={null}
Authorization: Bearer YOUR_API_KEY
```
A request with a missing or invalid key returns [`401`](/api-reference/errors).
## How API keys work
* **A key acts as a member.** Each key is created by a workspace member and acts as that member, with the same role, narrowed by the scopes you grant.
* **A key belongs to one workspace.** To call the API for another workspace, create a key from that workspace.
* **Keys expire.** Keys expire one year after they are created. Create a new key before the old one expires.
## Create an API key
In the Scribe dashboard, go to **Settings**, then open **API keys**.
Select **Create API key**, give it a descriptive name (for example, the name of the integration or agent that will use it), and choose its scopes.
Copy the key and store it somewhere secure, such as a secret manager. The full key is shown only once.
Treat an API key like a password. Anyone who has it can act as the member who created it, within that member's scopes. If a key is exposed, delete it from the dashboard and create a new one.
## Scopes
A key is limited to the scopes you grant it. Scopes use a `resource:action` format. A request that calls an endpoint outside the key's scopes returns [`403`](/api-reference/errors).
Grant the narrowest set of scopes an integration needs. For example, a reporting script that only reads signatures needs `signatures:read` and nothing else.
| Resource | Read | Write | Delete |
| - | - | - | - |
| Teammates | `teammates:read` | `teammates:write` | `teammates:delete` |
| Emails | `emails:read` | `emails:write` | `emails:delete` |
| Signatures | `signatures:read` | `signatures:write` | `signatures:delete` |
| Smart fields | `smart_fields:read` | `smart_fields:write` | `smart_fields:delete` |
| Folders | `folders:read` | `folders:write` | `folders:delete` |
| Assets | `assets:read` | `assets:write` | `assets:delete` |
| Marketing campaigns | `marketing_campaigns:read` | `marketing_campaigns:write` | `marketing_campaigns:delete` |
Integrations and financial documents are read only. They expose a single read scope each: `integrations:read` and `financial_documents:read`.
Integrations are connected and configured in the dashboard, never through an API key. A key can read them, but cannot activate, edit, or remove them.
## Keep your keys secure
* Store keys in environment variables or a secret manager. Never commit them to source control or ship them in client-side code.
* Use a separate key per integration, so you can delete one without affecting the others.
* Grant the minimum scopes required for the task.
* Delete unused keys, and create a replacement before a key expires.
# Get the content block-tree schema
Source: https://help.scribe-mail.com/api-reference/content-schema/get-the-content-block-tree-schema
/api-reference/openapi.json get /v1/content_schema
# Create an email
Source: https://help.scribe-mail.com/api-reference/emails/create-an-email
/api-reference/openapi.json post /v1/emails
# Delete an email
Source: https://help.scribe-mail.com/api-reference/emails/delete-an-email
/api-reference/openapi.json delete /v1/emails/{id}
# Install one email's signatures now
Source: https://help.scribe-mail.com/api-reference/emails/install-one-emails-signatures-now
/api-reference/openapi.json post /v1/emails/{id}/install
# List emails
Source: https://help.scribe-mail.com/api-reference/emails/list-emails
/api-reference/openapi.json get /v1/emails
# Update an email's address
Source: https://help.scribe-mail.com/api-reference/emails/update-an-emails-address
/api-reference/openapi.json patch /v1/emails/{id}
# Scribe API errors: status codes and error format
Source: https://help.scribe-mail.com/api-reference/errors
Understand Scribe API errors: the JSON error envelope, validation details, and what each HTTP status code from 401 to 422 means.
The Scribe API uses conventional HTTP status codes and returns a consistent JSON error envelope, so you can handle failures the same way across every endpoint.
## Error format
Every error response contains an `error` object:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "blank",
"message": "Name can't be blank."
}
}
```
| Field | Description |
| - | - |
| `type` | The category of error, such as `validation_error` or `not_found`. |
| `code` | A short, stable identifier for the specific error. |
| `message` | A human-readable explanation. |
### Validation errors
When a request fails validation, the response also includes a `details` array that pinpoints each invalid field:
```json theme={null}
{
"error": {
"type": "validation_error",
"code": "invalid",
"message": "The teammate could not be saved."
},
"details": [
{ "field": "email", "code": "invalid", "message": "Address is invalid." }
]
}
```
## Status codes
| Status | Meaning |
| - | - |
| `200 OK` | The request succeeded. |
| `201 Created` | The resource was created. |
| `204 No Content` | The request succeeded with no response body, for example after a delete. |
| `401 Unauthorized` | The API key is missing or invalid. See [Authentication](/api-reference/authentication). |
| `403 Forbidden` | The key lacks the required scope, or the feature is not available on your plan. |
| `404 Not Found` | The resource does not exist, or it belongs to another workspace. |
| `409 Conflict` | The request conflicts with the current state, for example deleting a folder that still contains signatures. |
| `422 Unprocessable Entity` | The request was understood but failed validation. Check the `details` array. |
Scribe returns `404` rather than `403` when a resource belongs to another workspace, so a key can never confirm whether a resource it cannot access exists.
## Handle errors gracefully
* Treat any non-`2xx` status as a failure, and read `error.type` and `error.code` to decide what to do.
* For `422`, surface the `details` array so the cause can be corrected field by field.
* For `401` and `403`, check that the key is valid and carries the scopes the endpoint requires.
* For `409`, resolve the conflicting state first, for example empty a folder before deleting it.
# Aggregated events (count + revenue)
Source: https://help.scribe-mail.com/api-reference/events/aggregated-events-count-+-revenue
/api-reference/openapi.json get /v1/analytics/events/summary
# List recorded events
Source: https://help.scribe-mail.com/api-reference/events/list-recorded-events
/api-reference/openapi.json get /v1/analytics/events
# Record an event
Source: https://help.scribe-mail.com/api-reference/events/record-an-event
/api-reference/openapi.json post /v1/analytics/events
# Send feedback to the Scribe team
Source: https://help.scribe-mail.com/api-reference/feedback/send-feedback-to-the-scribe-team
/api-reference/openapi.json post /v1/feedback
# List financial documents
Source: https://help.scribe-mail.com/api-reference/financial-documents/list-financial-documents
/api-reference/openapi.json get /v1/financial_documents
# Create a folder
Source: https://help.scribe-mail.com/api-reference/folders/create-a-folder
/api-reference/openapi.json post /v1/folders
# Delete a folder
Source: https://help.scribe-mail.com/api-reference/folders/delete-a-folder
/api-reference/openapi.json delete /v1/folders/{id}
# List folders
Source: https://help.scribe-mail.com/api-reference/folders/list-folders
/api-reference/openapi.json get /v1/folders
# Update a folder
Source: https://help.scribe-mail.com/api-reference/folders/update-a-folder
/api-reference/openapi.json patch /v1/folders/{id}
# List integration entities
Source: https://help.scribe-mail.com/api-reference/integration-entities/list-integration-entities
/api-reference/openapi.json get /v1/integration_entities
# List active integrations
Source: https://help.scribe-mail.com/api-reference/integrations/list-active-integrations
/api-reference/openapi.json get /v1/integrations
# Resync the team from its integrations now
Source: https://help.scribe-mail.com/api-reference/integrations/resync-the-team-from-its-integrations-now
/api-reference/openapi.json post /v1/integrations/sync
# Scribe API for email signatures, teammates, and campaigns
Source: https://help.scribe-mail.com/api-reference/introduction
The Scribe API is a REST API to manage email signatures, teammates, smart fields, and marketing campaigns in your workspace using JSON over HTTPS.
The Scribe API is a REST API. Use it to manage email signatures, teammates, smart fields, folders, assets, and marketing campaigns programmatically, and to automate the work you would otherwise do by hand in the Scribe dashboard.
Every request and response uses JSON over HTTPS. Resources are identified by UUID, and the API is versioned under `/v1`.
**Base URL**
```
https://api.scribe-mail.com/v1
```
## What you can build
| Resource | Use the API to |
| - | - |
| **Signatures** | Create, update, publish, install, and assign signature templates. |
| **Teammates** | Add the people whose signatures deploy, and set their smart field values. |
| **Emails** | Manage teammate email addresses and aliases. |
| **Smart fields** | Define the dynamic fields that populate signatures. |
| **Folders** | Organize signature templates. |
| **Assets** | Upload the images and files used in signatures and campaigns. |
| **Marketing campaigns** | Schedule, pause, and resume promotional banners. |
| **Integrations** | Read the integrations connected to your workspace. |
Browse the full endpoint reference in the sidebar, grouped by resource. Each endpoint page includes a request builder you can run with your own API key.
To receive events instead of asking for them, see [Webhooks](/webhooks/overview) in its own tab: Scribe posts a signed payload to your endpoint the moment something changes.
## Authenticate your requests
Authenticate every request with a workspace API key, sent as a Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
A key acts as the member who created it, within a single workspace. See [Authentication](/api-reference/authentication) to create a key and choose its scopes.
## Make your first request
This lists the signatures in your workspace:
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
```
A successful response returns a `data` array and a `pagination` object:
```json theme={null}
{
"data": [
{
"id": "3f1c2e9a-7b6d-4c5a-9f21-8e0d4b1a2c3d",
"name": "Company signature",
"priority": 1,
"signature_installation_activated": true,
"folder_id": null,
"last_published_at": "2026-06-01T09:30:00Z",
"created_at": "2026-05-20T14:00:00Z",
"updated_at": "2026-06-01T09:30:00Z"
}
],
"pagination": { "page": 1, "limit": 50, "total_count": 1, "total_pages": 1, "has_more": false }
}
```
## Conventions
All requests and responses are JSON. Send `Content-Type: application/json` on any request with a body.
Every resource is addressed by a UUID, never a sequential id.
The version is part of the path. New, backward-compatible fields can be added within `/v1`.
List endpoints return results in pages. See [Pagination](/api-reference/pagination).
## Next steps
Create an API key and scope it to the resources an integration needs.
Page through list endpoints with page and limit.
Status codes and the JSON error envelope.
The block tree format for signature and campaign content.
Receive signed events for conversions, installs, teammates, and campaigns.
# Create a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/create-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns
# Delete a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/delete-a-marketing-campaign
/api-reference/openapi.json delete /v1/marketing_campaigns/{id}
# List marketing campaigns
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/list-marketing-campaigns
/api-reference/openapi.json get /v1/marketing_campaigns
# Pause a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/pause-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/pause
# Preview a campaign's content
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/preview-a-campaigns-content
/api-reference/openapi.json get /v1/marketing_campaigns/{id}/preview
# Resume a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/resume-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/resume
# Schedule a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/schedule-a-marketing-campaign
/api-reference/openapi.json post /v1/marketing_campaigns/{id}/schedule
# Update a marketing campaign
Source: https://help.scribe-mail.com/api-reference/marketing-campaigns/update-a-marketing-campaign
/api-reference/openapi.json patch /v1/marketing_campaigns/{id}
# Scribe API pagination: page-based list endpoints
Source: https://help.scribe-mail.com/api-reference/pagination
Scribe API list endpoints use page-based pagination. Page through results with the page and limit parameters and the pagination object.
List endpoints, such as `GET /v1/signatures` and `GET /v1/teammates`, return results one page at a time using page-based pagination. Results are ordered newest first.
## Query parameters
| Parameter | Type | Description |
| - | - | - |
| `page` | integer | The 1-based page number to fetch. Defaults to `1`. |
| `limit` | integer | Page size. Defaults to `50`. Maximum `100`. |
## The pagination object
Every list response includes a `pagination` object alongside the `data` array:
```json theme={null}
{
"data": [ ... ],
"pagination": {
"page": 1,
"limit": 50,
"total_count": 1284,
"total_pages": 26,
"has_more": true
}
}
```
| Field | Description |
| - | - |
| `page` | The page number returned in this response. |
| `limit` | The page size applied to this response. |
| `total_count` | Total number of records across all pages. |
| `total_pages` | Total number of pages at this `limit`. |
| `has_more` | `true` when more pages are available (`page` is less than `total_pages`). |
## Fetch every page
Request page 1, then increment `page` until `has_more` is `false`:
```bash theme={null}
# First page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=1" \
-H "Authorization: Bearer YOUR_API_KEY"
# Next page
curl "https://api.scribe-mail.com/v1/teammates?limit=100&page=2" \
-H "Authorization: Bearer YOUR_API_KEY"
```
The same loop in JavaScript:
```javascript theme={null}
async function listAllTeammates(apiKey) {
const results = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = new URL("https://api.scribe-mail.com/v1/teammates");
url.searchParams.set("limit", "100");
url.searchParams.set("page", String(page));
const res = await fetch(url, {
headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
results.push(...body.data);
hasMore = body.pagination.has_more;
page += 1;
}
return results;
}
```
# Scribe API signature content: the block tree format
Source: https://help.scribe-mail.com/api-reference/signature-content
Signatures and campaigns store their layout as a content block tree. Learn the structure Scribe validates when you write signature content.
Signatures and marketing campaigns store their visual layout as a **content block tree**: a nested JSON structure of typed blocks. When you create or update a signature, you send this tree as `draft_content`. For a campaign, you send it as `content`.
The full schema is documented as `signature_content` on the **Create a signature** (`POST /v1/signatures`) request in the endpoint reference. This page explains how the tree is shaped so your writes pass validation.
## The shape of the tree
The tree always starts with a single `stack` block at the root. Every block has a `type`, and a `stack` holds an ordered list of child blocks in its `children` array. A child can itself be a `stack`, which is how rows, columns, and groups are built.
```json theme={null}
{
"type": "stack",
"children": [
{ "type": "text", "...": "..." },
{ "type": "image", "...": "..." }
]
}
```
## Block types
| Type | Renders |
| - | - |
| `stack` | A container that lays out its `children` as rows, columns, or groups. |
| `text` | A line of text, built from text tokens and smart-field tokens. |
| `image` | An image, such as a logo or a photo. |
| `icon` | A single icon. |
| `button` | A call-to-action button with a link. |
| `list` | A labelled list, for example a block of contact details. |
| `socialList` | A row of social media icons. |
| `divider` | A horizontal separator. |
| `marketing` | A promotional banner driven by a marketing campaign. |
The `list` and `socialList` blocks contain their own item blocks (`listItem`, `listItemLabel`, and `socialListItem`).
## Smart-field tokens
Text and other blocks can include **smart-field tokens** that resolve to a teammate's data, such as their name, job title, or phone number, when the signature renders. This is how one template produces a personalized signature for every teammate. Define the available fields with the smart fields endpoints (`GET /v1/smart_fields` and `POST /v1/smart_fields`).
## Write content safely
Validation is strict. An invalid tree is rejected with [`422`](/api-reference/errors), and the response pinpoints the offending field. The safest way to produce a valid tree is to start from one that already renders:
Fetch a signature whose layout is close to what you want with `GET /v1/signatures`, and copy its `content`.
Change only what you need, for example swapping an image URL or editing the text of a block, and keep the structure intact.
Send the updated tree as `draft_content` on `POST /v1/signatures` or `PATCH /v1/signatures/{id}`.
To clear a content field, send `null`.
## Publish your changes
Writing `draft_content` updates the draft only. To make a signature live, call `POST /v1/signatures/{id}/publish`. Publishing copies the draft into the published content and triggers installation for the assigned recipients. To re-trigger installation without changing the content, call `POST /v1/signatures/{id}/install`.
## Related
* [Signatures overview](/en/signatures-overview): how signatures work in Scribe.
* [Smart fields](/en/smart-fields): personalize signatures with dynamic data.
* [Campaigns overview](/en/marketing-overview): run promotional banners across your team's signatures.
# Add manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/add-manual-recipient-emails
/api-reference/openapi.json post /v1/signatures/{signature_id}/emails
# Create a signature
Source: https://help.scribe-mail.com/api-reference/signatures/create-a-signature
/api-reference/openapi.json post /v1/signatures
# Create or update a variant (upsert)
Source: https://help.scribe-mail.com/api-reference/signatures/create-or-update-a-variant-upsert
/api-reference/openapi.json patch /v1/signatures/{signature_id}/variants/{kind}
# Delete a signature
Source: https://help.scribe-mail.com/api-reference/signatures/delete-a-signature
/api-reference/openapi.json delete /v1/signatures/{id}
# Duplicate a signature
Source: https://help.scribe-mail.com/api-reference/signatures/duplicate-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/duplicate
# Get a signature's real rendered HTML for a recipient
Source: https://help.scribe-mail.com/api-reference/signatures/get-a-signatures-real-rendered-html-for-a-recipient
/api-reference/openapi.json get /v1/signatures/{id}/html
# Install a signature
Source: https://help.scribe-mail.com/api-reference/signatures/install-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/install
# List a signature's recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-recipient-emails
/api-reference/openapi.json get /v1/signatures/{signature_id}/emails
# List a signature's reply/internal variants
Source: https://help.scribe-mail.com/api-reference/signatures/list-a-signatures-replyinternal-variants
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants
# List per-email signature installation state
Source: https://help.scribe-mail.com/api-reference/signatures/list-per-email-signature-installation-state
/api-reference/openapi.json get /v1/signature_installations
# List signatures
Source: https://help.scribe-mail.com/api-reference/signatures/list-signatures
/api-reference/openapi.json get /v1/signatures
# Preview a signature with placeholder values
Source: https://help.scribe-mail.com/api-reference/signatures/preview-a-signature-with-placeholder-values
/api-reference/openapi.json get /v1/signatures/{id}/preview
# Publish a signature
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-signature
/api-reference/openapi.json post /v1/signatures/{id}/publish
# Publish a variant
Source: https://help.scribe-mail.com/api-reference/signatures/publish-a-variant
/api-reference/openapi.json post /v1/signatures/{signature_id}/variants/{kind}/publish
# Remove manual recipient emails
Source: https://help.scribe-mail.com/api-reference/signatures/remove-manual-recipient-emails
/api-reference/openapi.json delete /v1/signatures/{signature_id}/emails
# Reset a variant to the primary signature
Source: https://help.scribe-mail.com/api-reference/signatures/reset-a-variant-to-the-primary-signature
/api-reference/openapi.json delete /v1/signatures/{signature_id}/variants/{kind}
# Set recipient rules (future-flag + smart-field conditions)
Source: https://help.scribe-mail.com/api-reference/signatures/set-recipient-rules-future-flag-+-smart-field-conditions
/api-reference/openapi.json patch /v1/signatures/{signature_id}/emails
# Show one variant
Source: https://help.scribe-mail.com/api-reference/signatures/show-one-variant
/api-reference/openapi.json get /v1/signatures/{signature_id}/variants/{kind}
# Target org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/target-org-units-groups
/api-reference/openapi.json post /v1/signatures/{signature_id}/integration_entities
# Untarget org units / groups
Source: https://help.scribe-mail.com/api-reference/signatures/untarget-org-units-groups
/api-reference/openapi.json delete /v1/signatures/{signature_id}/integration_entities
# Update a signature
Source: https://help.scribe-mail.com/api-reference/signatures/update-a-signature
/api-reference/openapi.json patch /v1/signatures/{id}
# Create a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/create-a-smart-field
/api-reference/openapi.json post /v1/smart_fields
# Delete a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/delete-a-smart-field
/api-reference/openapi.json delete /v1/smart_fields/{id}
# List smart fields
Source: https://help.scribe-mail.com/api-reference/smart-fields/list-smart-fields
/api-reference/openapi.json get /v1/smart_fields
# Update a smart field
Source: https://help.scribe-mail.com/api-reference/smart-fields/update-a-smart-field
/api-reference/openapi.json patch /v1/smart_fields/{id}
# Create a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/create-a-teammate
/api-reference/openapi.json post /v1/teammates
# Delete a teammate
Source: https://help.scribe-mail.com/api-reference/teammates/delete-a-teammate
/api-reference/openapi.json delete /v1/teammates/{id}
# List teammates
Source: https://help.scribe-mail.com/api-reference/teammates/list-teammates
/api-reference/openapi.json get /v1/teammates
# Update a teammate's smart fields
Source: https://help.scribe-mail.com/api-reference/teammates/update-a-teammates-smart-fields
/api-reference/openapi.json patch /v1/teammates/{id}
# Scribe API use cases: manage teammates, audit signatures, measure ROI
Source: https://help.scribe-mail.com/api-reference/use-cases
What teams build with the Scribe API: provision teammates you manage by hand, audit signature compliance, schedule campaigns, measure ROI, and export data.
The Scribe API turns email signature management into something you can automate and wire into the rest of your stack. Instead of clicking through the dashboard, you can provision the teammates you manage by hand, audit your whole team in one call, schedule banner campaigns, and pull engagement data into your own tools.
Every example below maps to endpoints you can browse in the sidebar. Pick the workflow that matches your goal, then follow the links to the exact requests.
## What you can build
Create teammates and set their smart field values from your own records, for people you manage by hand rather than syncing a directory.
Add a teammate, set their fields, and install the right signature the day they join. Remove them the day they leave.
Check which templates are published and installed, and who they are assigned to, across your team.
Create, update, publish, and organize signature templates programmatically, version controlled in your own repo.
Launch, pause, and resume promotional banners on a schedule, tied to your product or sales calendar.
Pull views, clicks, and clickthrough rate over time, broken down by template, campaign, teammate, or country.
Schedule a pull of analytics and push signature engagement into your data warehouse or BI tool.
Read your plan, seat count, and invoices to keep finance systems in step with your workspace.
## Manage teammates programmatically
If you manage teammates by hand instead of syncing a directory, the API is the programmatic version of the manual form and CSV upload. Create teammates and set their smart field values from your own records, so when someone joins, changes role, or leaves, you push the change and their signature follows.
Importing teammates from **Microsoft Entra ID** or **Google Workspace** is set up inside Scribe with OAuth, and that data flows one way, from your directory into Scribe. The API does not configure that sync or write back to synced directory fields, so use these endpoints for the teammates you manage manually. See [Connect Microsoft Entra ID](/en/teammates/connect-microsoft-entra-id) and the [Teammates overview](/en/teammates/teammates-overview).
List your [smart fields](/en/smart-fields) to get the IDs you will populate, like job title or phone number.
```bash theme={null}
curl https://api.scribe-mail.com/v1/smart_fields \
-H "Authorization: Bearer YOUR_API_KEY"
```
Send each person's email and smart field values. Run this whenever a record changes in your own system to keep Scribe in step.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teammate": {
"email": "jordan@acme.com",
"smart_fields": [
{ "smart_field_id": "8e0d4b1a-2c3d-4f5a-9b6d-7c2e9a3f1c2e", "value": "Account Executive" },
{ "smart_field_id": "a1b2c3d4-5e6f-4a8b-9c0d-1e2f3a4b5c6d", "value": "+1 555 0142" }
]
}
}'
```
Install a published template so it deploys to the teammate's mailbox.
```bash theme={null}
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/install \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY"
```
Delete the teammate to stop their signature from deploying.
```bash theme={null}
curl https://api.scribe-mail.com/v1/teammates/TEAMMATE_ID \
-X DELETE \
-H "Authorization: Bearer YOUR_API_KEY"
```
Run this on a schedule (a nightly job from your own system) so the teammates you manage by hand never drift from your records.
## Audit signatures across your team
Answer compliance questions in one pass: which templates are live, who they reach, and whether any integration is failing. List signatures to read their publish and installation status, then list each signature's recipient emails to confirm coverage.
```bash theme={null}
# Every signature, with publish and install status
curl https://api.scribe-mail.com/v1/signatures \
-H "Authorization: Bearer YOUR_API_KEY"
# Who a given signature is assigned to
curl https://api.scribe-mail.com/v1/signatures/SIGNATURE_ID/emails \
-H "Authorization: Bearer YOUR_API_KEY"
```
To check the systems feeding your workspace, list active [integrations](/en/integrations-overview) and their synced entities. This is how you catch a directory sync that has gone stale before it shows up in someone's signature.
## Measure signature performance and ROI
Signatures are a channel, so treat them like one. The analytics endpoints return views, clicks, and clickthrough rate, which you can trend over time or break down by dimension.
```bash theme={null}
# Views and clicks over time for one template, week by week
curl "https://api.scribe-mail.com/v1/analytics/overview\
?start_date=2026-01-01&end_date=2026-03-31&interval=week\
&signature_template_id=SIGNATURE_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# Rank templates by clickthrough rate
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=signature_template&order_by=clickthrough_rate&order=desc\
&start_date=2026-01-01&end_date=2026-03-31" \
-H "Authorization: Bearer YOUR_API_KEY"
```
Break down by `marketing_campaign` to compare banner campaigns, by `teammate` to find your top performers, or by `country` to see where your signatures land. See [Analytics](/en/analytics-overview) for what each metric means.
## Export engagement to your warehouse
Because the breakdown endpoint paginates and accepts a date range, it doubles as an export. Schedule a job that pulls each day's engagement by the dimension you care about, then load it into your warehouse or BI tool to power retargeting and reporting with real audience signals.
```bash theme={null}
# Daily engagement by country, page through with page and limit
curl "https://api.scribe-mail.com/v1/analytics/breakdown\
?dimension=country&start_date=2026-06-01&end_date=2026-06-01&limit=100" \
-H "Authorization: Bearer YOUR_API_KEY"
```
See [Pagination](/api-reference/pagination) for paging through large result sets.
## Automate marketing campaigns
Drive banner campaigns from your product or sales calendar. Create a campaign, schedule it to go live, then pause or resume it without touching the dashboard.
```bash theme={null}
# Schedule a campaign to start
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/schedule \
-X POST \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
# Pause it, then resume later
curl https://api.scribe-mail.com/v1/marketing_campaigns/CAMPAIGN_ID/pause \
-X POST -H "Authorization: Bearer YOUR_API_KEY"
```
Pair this with the analytics endpoints to measure each campaign as it runs.
## Operations and finance
Keep your own systems in step with your workspace. Read the workspace to get your current plan and seat count, and list financial documents to reconcile invoices in your finance stack.
```bash theme={null}
# Plan and seat count
curl https://api.scribe-mail.com/v1/workspace \
-H "Authorization: Bearer YOUR_API_KEY"
# Invoices and other financial documents
curl https://api.scribe-mail.com/v1/financial_documents \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Tips for building reliably
Give each integration its own API key, scoped to only the resources it needs.
List endpoints are page-based. Increment `page` until `has_more` is false.
Check status codes and the JSON error envelope so a sync fails loudly, not silently.
Signatures and banners use a block tree. Learn the format before you create templates.
## Next steps
The base URL, the auth header, and a first call you can run now.
The Scribe MCP server runs these same workflows from your AI assistant.
The workflows you receive instead of poll: conversions, failed installs, teammate changes.
# Get an identified visitor
Source: https://help.scribe-mail.com/api-reference/visitors/get-an-identified-visitor
/api-reference/openapi.json get /v1/analytics/visitors/{id}
# List identified visitors
Source: https://help.scribe-mail.com/api-reference/visitors/list-identified-visitors
/api-reference/openapi.json get /v1/analytics/visitors
# Visitor acquisition breakdown (first-touch)
Source: https://help.scribe-mail.com/api-reference/visitors/visitor-acquisition-breakdown-first-touch
/api-reference/openapi.json get /v1/analytics/visitors/breakdown
# Get the current workspace's plan and seat count
Source: https://help.scribe-mail.com/api-reference/workspace/get-the-current-workspaces-plan-and-seat-count
/api-reference/openapi.json get /v1/workspace
# Webhook event types
Source: https://help.scribe-mail.com/webhooks/events
Every webhook event Scribe can send: conversions, visitors, signatures, teammates, campaigns and integrations, with payload examples.
Every event payload carries a `type` field naming the event and an `occurred_at` ISO 8601 timestamp. All resource references are the same uuids the [REST API](/api-reference/introduction) serves, so you can always fetch the full resource after receiving an event.
Subscribe to specific event types per endpoint in the webhook portal, or subscribe to all of them. See the [overview](/webhooks/overview) for setup and signature verification, and [use cases](/webhooks/use-cases) for what to build with each event.
## Conversions & visitors
### `conversion.recorded`
An attributed conversion event was accepted for your workspace. Only click-attributed, deduplicated conversions are delivered, the same gating as [conversion tracking](/en/conversion-tracking) itself.
```json theme={null}
{
"type": "conversion.recorded",
"event_id": "order-1042",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"source": "api",
"occurred_at": "2026-08-11T09:30:00Z",
"visitor": {
"anonymous_id": "5f2c...",
"user_id": "user-42"
},
"attribution": {
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"anchor_uuid": "e5f6a7b8-...",
"email_uuid": "c9d0e1f2-...",
"marketing_campaign_uuid": ""
},
"properties": { "plan": "pro" }
}
```
`event_id` is the idempotency key you supplied when tracking the event (may be null). Attribution uuids are empty strings when unresolved.
### `visitor.identified`
A signature-attributed visitor was identified for the first time, meaning a `user_id` your workspace had never seen before. Re-identifies of a known visitor (for example on every page load) do not fire. Fetch the full profile at `GET /v1/analytics/visitors/{visitor.id}`.
```json theme={null}
{
"type": "visitor.identified",
"visitor": {
"id": "b4c5d6e7-...",
"user_id": "user-42",
"anonymous_id": "5f2c...",
"identified_via": "browser",
"first_seen_at": "2026-08-11T09:28:12Z",
"traits": { "email": "ada@example.com" }
},
"attribution": {
"click_id": "f1e2d3c4-...",
"teammate_uuid": "7d3f0e58-...",
"signature_template_uuid": "a1b2c3d4-...",
"email_uuid": "c9d0e1f2-..."
},
"occurred_at": "2026-08-11T09:28:12Z"
}
```
## Signatures
### `signature.published`
A signature's draft was published (made live). Covers primary signatures and reply/internal variants, discriminated by `signature.kind`.
```json theme={null}
{
"type": "signature.published",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary",
"folder_uuid": "d4e5f6a7-..."
},
"occurred_at": "2026-08-11T10:00:00Z"
}
```
`name` and `folder_uuid` are null for variants. `kind` is one of `primary`, `reply_variant`, `internal_variant`.
### `signature.installation.failed`
Installing a signature into a specific mailbox failed. Fired once per failure transition: a mailbox that stays broken does not re-fire daily; after a successful reinstall, a new failure fires again.
```json theme={null}
{
"type": "signature.installation.failed",
"error_code": "user_not_found",
"email": {
"uuid": "c9d0e1f2-...",
"address": "ada@acme.com"
},
"teammate_uuid": "7d3f0e58-...",
"signature": {
"uuid": "a1b2c3d4-...",
"name": "Sales team",
"kind": "primary"
},
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail"
},
"occurred_at": "2026-08-11T04:00:00Z"
}
```
Known `error_code` values: `user_not_found`, `forbidden`, `unauthorized_client`, `channel_not_found`, `signature_too_long`, `multi_signatures_not_supported`. New codes may be added over time.
## Teammates
### `teammate.created`
A teammate was added to your workspace, by a user in the dashboard, through the API, or by a directory sync importing a new person.
```json theme={null}
{
"type": "teammate.created",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:00:00Z"
}
```
### `teammate.deleted`
A teammate was removed, by a user or by a directory sync removing a departed person. Fired at removal time; the payload is your last chance to read the teammate's identifiers.
```json theme={null}
{
"type": "teammate.deleted",
"teammate": {
"uuid": "7d3f0e58-...",
"display_name": "Ada Lovelace"
},
"emails": [
{ "uuid": "c9d0e1f2-...", "address": "ada@acme.com", "primary": true }
],
"occurred_at": "2026-08-11T11:30:00Z"
}
```
## Campaigns
All five campaign events share the same payload shape:
```json theme={null}
{
"type": "campaign.started",
"campaign": {
"uuid": "3c4d5e6f-...",
"name": "Summer promo",
"status": "active",
"start_time": "2026-08-12T07:00:00Z",
"end_time": "2026-08-20T16:00:00Z",
"time_zone": "Europe/Brussels",
"signature_template_uuids": ["a1b2c3d4-..."]
},
"occurred_at": "2026-08-12T07:12:00Z"
}
```
| Event | Fired when |
| - | - |
| `campaign.scheduled` | A user scheduled a campaign for a future start |
| `campaign.started` | The campaign went live, immediately at schedule time if the start was already due, or when its start time is reached (checked every 30 minutes) |
| `campaign.paused` | A user paused a live campaign |
| `campaign.resumed` | A user resumed a paused campaign |
| `campaign.ended` | The campaign reached its end time and was archived (checked every 30 minutes) |
`status` reflects the post-transition state: `draft`, `scheduled`, `active`, `paused` or `archived`.
## Integrations
### `integration.connected`
An integration was connected and became active for the first time. Re-authentications of an already-connected integration do not fire.
```json theme={null}
{
"type": "integration.connected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T14:00:00Z"
}
```
`category` is one of `teammates`, `signatures`, `smart_fields`, `assets`.
### `integration.access_lost`
Scribe lost access to a connected integration (revoked or expired credentials). Signature installs and teammate syncs through this integration are paused until an admin reconnects it, and `reconnect_url` deep-links straight to the fix. Fired once per loss; a reconnect re-arms it.
```json theme={null}
{
"type": "integration.access_lost",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"error_message": "invalid_grant",
"reconnect_url": "https://app.scribe-mail.com/integrations?integrationId=12",
"occurred_at": "2026-08-11T15:00:00Z"
}
```
### `integration.disconnected`
An integration was disconnected (removed) by a user.
```json theme={null}
{
"type": "integration.disconnected",
"integration": {
"uuid": "9a8b7c6d-...",
"kind": "google_workspace_gmail",
"category": "signatures",
"name": "Gmail"
},
"occurred_at": "2026-08-11T16:00:00Z"
}
```
# Webhooks: real-time event notifications
Source: https://help.scribe-mail.com/webhooks/overview
Receive signed HTTP notifications when things happen in your Scribe workspace: conversions recorded, signatures published, teammates changed, campaigns going live.
Webhooks push events from your Scribe workspace to your own systems the moment they happen. Instead of polling the API, you register an HTTPS endpoint, subscribe to the [event types](/webhooks/events) you care about, and Scribe sends a signed `POST` request for each event.
Typical uses: syncing conversions into your CRM or data warehouse, alerting on signature installation failures, mirroring teammate changes into internal tools, and reacting to campaigns going live. See [use cases](/webhooks/use-cases) for the workflows in full, with the code to handle each event.
Webhooks are part of the Scribe API and require a plan with API access. Only workspace owners and admins can manage webhook endpoints.
## Setting up an endpoint
Webhook endpoints are managed from the Scribe dashboard:
1. Open **Settings → Webhooks** (in the Technical section).
2. Click **Manage webhooks**. This opens your workspace's webhook portal.
3. Add your HTTPS endpoint URL and pick the event types to subscribe to, or subscribe to all events.
The portal is also where you inspect delivery logs, replay failed deliveries, test endpoints, and rotate signing secrets. Everything in the portal is scoped to your workspace.
## Receiving events
Every delivery is an HTTP `POST` with a JSON body. The `type` field tells you which event you received; the rest of the payload is event-specific (see the [event catalog](/webhooks/events)):
```json theme={null}
{
"type": "conversion.recorded",
"name": "purchase",
"value": 99.0,
"currency": "USD",
"occurred_at": "2026-08-11T09:30:00Z",
"...": "..."
}
```
Respond with any `2xx` status code to acknowledge the delivery. Anything else, including timeouts, counts as a failure and triggers retries.
## Verifying signatures
Every delivery is signed so you can verify it genuinely came from Scribe and was not tampered with. Each request carries three headers:
| Header | Purpose |
| - | - |
| `svix-id` | Unique id for this message (stable across retries) |
| `svix-timestamp` | Unix timestamp of the delivery attempt |
| `svix-signature` | HMAC signature of the payload |
Scribe webhooks are powered by [Svix](https://www.svix.com/) and follow the widely-used signing scheme of the [Standard Webhooks](https://www.standardwebhooks.com/) specification. The easiest way to verify is an official Svix library. Your endpoint's signing secret is shown in the webhook portal:
```javascript theme={null}
import { Webhook } from "svix";
const wh = new Webhook(WEBHOOK_SECRET);
// Throws if the signature is invalid or the timestamp is too old.
const payload = wh.verify(req.body, req.headers);
```
Verification libraries exist for most languages. See the [Svix documentation](https://docs.svix.com/receiving/verifying-payloads/how) for the full list and for manual verification details. Always verify signatures before trusting a payload, and reject deliveries with timestamps older than a few minutes to prevent replay.
## Delivery, retries and ordering
* **Retries.** Failed deliveries are retried automatically with exponential backoff over roughly a day. Endpoints that keep failing are eventually disabled; you can re-enable them and replay missed deliveries from the portal.
* **At-least-once.** A delivery can occasionally arrive more than once. Handle deliveries idempotently: the `svix-id` header is stable across retries of the same message and is the right dedup key.
* **Ordering is not guaranteed.** Events are delivered independently and can arrive out of order. Use the payload's `occurred_at` when sequence matters.
* **Semantics.** Most events are emitted on state *transitions*, not on every write. For example, `signature.installation.failed` fires once when an installation breaks, not daily while it stays broken, and `visitor.identified` fires only the first time a person is identified.
## Endpoint requirements
* HTTPS only, reachable from the public internet.
* Respond within 15 seconds. Do your processing asynchronously if it can take longer.
* Deliveries originate from Svix; if you need IP allowlisting, the current address list is published in the [Svix documentation](https://docs.svix.com/receiving/source-ips).
# Scribe webhook use cases: sync conversions, alert on failed installs
Source: https://help.scribe-mail.com/webhooks/use-cases
What teams build with Scribe webhooks: push conversions into a CRM, build Google Ads and Meta retargeting audiences, and alert on failed signature installs.
Scribe webhooks push a signed HTTPS request to your own endpoint every time something happens in your workspace: a conversion is attributed, a signature fails to install, a teammate is added or removed, a campaign goes live. Instead of polling the API on a schedule and hoping your window was tight enough, you receive the event and act on it.
This page walks through the workflows teams build most often, with the events to subscribe to and the code to handle each one. Set your endpoint up first in the [overview](/webhooks/overview), then browse the [event catalog](/webhooks/events) for the exact payload of every event.
## What you can build
Push signature-attributed conversions into your CRM or warehouse as they happen, with the teammate, template, and campaign that earned them.
Feed Google Ads Customer Match and Meta Custom Audiences with people who clicked an email signature, and suppress them once they convert.
Tell IT the moment a signature fails to install in a mailbox, with the error code and the mailbox that needs attention.
Catch a revoked Google Workspace or Microsoft 365 connection before signatures go stale, and route an admin straight to the reconnect screen.
Mirror teammate joins and departures into your ITSM, HR tool, or internal directory without a nightly sync.
Announce a banner going live in Slack, and annotate your analytics dashboards with the exact start and end times.
Archive every workspace event with its timestamp, so you can answer compliance questions months later.
## Which webhook events to subscribe to
Subscribe each endpoint to only what it needs. A narrow subscription means less traffic to verify, fewer payloads to ignore, and a delivery log you can actually read.
| Your goal | Subscribe to |
| - | - |
| Revenue attribution | `conversion.recorded`, `visitor.identified` |
| Ad retargeting and suppression | `visitor.identified`, `conversion.recorded` |
| Deployment health alerts | `signature.installation.failed`, `integration.access_lost` |
| Onboarding and offboarding | `teammate.created`, `teammate.deleted` |
| Campaign coordination | `campaign.scheduled`, `campaign.started`, `campaign.paused`, `campaign.resumed`, `campaign.ended` |
| Audit trail and compliance | `signature.published`, `integration.connected`, `integration.disconnected` |
## How to receive a Scribe webhook
All the examples below sit behind the same skeleton: verify the signature, acknowledge immediately, then do the real work outside the request. Scribe expects a `2xx` within 15 seconds, so anything slower than a database write belongs in a queue.
```javascript theme={null}
import express from "express";
import { Webhook } from "svix";
const app = express();
const wh = new Webhook(process.env.SCRIBE_WEBHOOK_SECRET);
// Verification needs the raw body, so do not parse JSON before it.
app.post("/webhooks/scribe", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = wh.verify(req.body, req.headers);
} catch {
return res.sendStatus(400);
}
// Acknowledge first. Retries are expensive for both sides.
res.sendStatus(200);
// svix-id is stable across retries of the same message: use it to deduplicate.
await queue.add("scribe-event", { id: req.headers["svix-id"], event });
});
```
Never trust a payload you have not verified. An unverified endpoint accepts anything the internet posts at it, including fake conversions and fake departures.
## Sync signature conversions into your CRM or warehouse
Subscribe to `conversion.recorded` to push signature-attributed revenue into your CRM as it lands. The event fires for every attributed, deduplicated conversion and carries the attribution chain with it: which teammate's signature, which template, which email, which campaign. That is enough to close the loop between an email signature and a closed deal without a single join in your warehouse.
```javascript theme={null}
async function onConversionRecorded(event, deliveryId) {
const { visitor, attribution, properties } = event;
await crm.upsertOpportunity({
// event_id is the idempotency key you passed when tracking. It can be null,
// so fall back to the svix-id of the delivery.
externalId: event.event_id ?? deliveryId,
contactExternalId: visitor.user_id,
name: event.name,
amount: event.value,
currency: event.currency,
closedAt: event.occurred_at,
source: "Email signature",
ownerUuid: attribution.teammate_uuid || null,
campaignUuid: attribution.marketing_campaign_uuid || null,
plan: properties?.plan,
});
}
```
Pair it with `visitor.identified`, which fires the first time a signature-attributed visitor resolves to a known `user_id`. That is the event that turns an anonymous click into a person, so it is the natural moment to create the contact record the conversion will later attach to. Attribution uuids arrive as empty strings when they could not be resolved, so treat them as optional.
Writing to a warehouse instead of a CRM? Land the raw payload in a staging table keyed on the `svix-id` header, then model it downstream. Replays and duplicate deliveries collapse on their own, and you keep the original event if your schema changes later.
See [conversion tracking](/en/conversion-tracking) for how conversions get recorded in the first place.
## Build retargeting audiences in Google Ads and Meta
Subscribe to `visitor.identified` to feed a first-party retargeting audience the moment someone who clicked an email signature identifies themselves. These are people your team already emailed and who then engaged, which makes them a warmer audience than anything a pixel collects from cold traffic, and it costs you no extra tracking on your site.
The event carries the visitor's `traits`, so when your site identifies people with an email address you have everything both platforms need. Google Ads Customer Match and Meta Custom Audiences both accept a SHA-256 hash of the normalized address, so the raw email never leaves your systems.
```javascript theme={null}
import { createHash } from "node:crypto";
// Both platforms expect SHA-256 of the trimmed, lowercased address.
const hashEmail = (email) => createHash("sha256").update(email.trim().toLowerCase()).digest("hex");
async function onVisitorIdentified(event) {
const email = event.visitor.traits?.email;
if (!email) return;
// Only upload people whose consent covers advertising audiences.
if (!(await consent.allowsAdvertising(email))) return;
const hashedEmail = hashEmail(email);
await Promise.all([
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
meta.customAudiences.add({
audienceId: process.env.META_AUDIENCE_ID,
schema: ["EMAIL_SHA256"],
data: [[hashedEmail]],
}),
]);
}
```
Then use `conversion.recorded` for the other half of the job: taking people out of the audience once they convert, so you stop paying to advertise to customers you already won. That payload identifies the visitor by `user_id` and `anonymous_id` rather than by email, so resolve the address from your own records before you suppress.
```javascript theme={null}
async function suppressConverted(event) {
const person = await db.people.findByUserId(event.visitor.user_id);
if (!person?.email) return;
const hashedEmail = hashEmail(person.email);
await Promise.all([
googleAds.customerMatch.remove({
userListId: process.env.GOOGLE_ADS_USER_LIST_ID,
hashedEmail,
}),
googleAds.customerMatch.add({
userListId: process.env.GOOGLE_ADS_CONVERTED_LIST_ID,
hashedEmail,
}),
]);
}
```
Three things worth building on top of that:
* **Segment by what they clicked.** The attribution in both payloads names the `signature_template_uuid` and `marketing_campaign_uuid` behind the click, so you can keep one audience per banner campaign and match the ad creative to the signature that earned the visit.
* **Seed value-based lookalikes.** `conversion.recorded` carries `value` and `currency`, which is exactly what Google Ads and Meta want for value-based Similar segments and Lookalike Audiences. Send converters with their value rather than a flat list.
* **Close the loop server side.** Meta's Conversions API accepts a server event with the hashed email in `user_data` plus the value in `custom_data`, so a signature-attributed conversion can be reported without relying on a browser pixel firing.
Uploading customer identifiers is regulated. You need a lawful basis and, in most of Europe, explicit consent covering advertising before an address goes to an ad platform, and both platforms hold you to their own customer data policies. Always hash, always check consent first, and honor deletions in your audiences as well as in your own database.
Neither platform serves ads against a tiny list. Both enforce a minimum matched audience size, so a new audience needs time to fill before campaigns can run against it. Check the current threshold in the Google Ads and Meta documentation when you size your first list.
## Alert your team when a signature install fails
Subscribe to `signature.installation.failed` to catch a broken install the moment it happens, rather than when somebody notices their emails look wrong. The event fires once per failure and names the mailbox, the template, the integration, and a machine-readable `error_code`.
```javascript theme={null}
async function onInstallationFailed(event) {
const { email, signature, integration, error_code } = event;
await fetch(process.env.SLACK_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
text: [
`Signature install failed for *${email.address}*`,
`Template: ${signature.name} (${signature.kind})`,
`Integration: ${integration.kind}`,
`Reason: \`${error_code}\``,
].join("\n"),
}),
});
}
```
Route by error code so the alert reaches someone who can fix it. `user_not_found` usually means a mailbox was deleted or renamed and belongs with IT. `unauthorized_client` and `forbidden` point at OAuth scopes or admin consent. `signature_too_long` and `multi_signatures_not_supported` are design problems for whoever owns the template. The catalog lists the [current error codes](/webhooks/events), and new ones can appear, so always keep a default branch.
Because the event fires on the transition into failure rather than on every retry, a mailbox that stays broken will not page you daily. Track your own open items and close them when a later install succeeds.
## Reconnect a broken Google Workspace or Microsoft 365 integration
Subscribe to `integration.access_lost` to hear the moment Scribe loses access to a connected Google Workspace, Microsoft 365, or directory integration. When credentials are revoked or expire, Scribe pauses installs and teammate syncs through that integration, and every hour it stays broken, more people carry an out of date signature. The event arrives with a `reconnect_url` that deep-links to the exact screen an admin needs.
```javascript theme={null}
async function onIntegrationAccessLost(event) {
const { integration, error_message, reconnect_url } = event;
await pagerduty.trigger({
summary: `Scribe lost access to ${integration.name}`,
severity: integration.category === "signatures" ? "error" : "warning",
details: error_message,
links: [{ href: reconnect_url, text: "Reconnect in Scribe" }],
});
}
```
Escalate on `category`, not on the integration name. Losing a `signatures` integration stops deployments to real mailboxes and deserves a page. Losing a `smart_fields` or `assets` integration usually means stale content, which can wait for business hours. Subscribe to `integration.connected` and `integration.disconnected` alongside it to resolve the incident automatically when someone reconnects.
## Automate teammate onboarding and offboarding
Subscribe to `teammate.created` and `teammate.deleted` to drive onboarding and offboarding from the same signal Scribe uses. Both fire whether the change came from the dashboard, the API, or a directory sync importing and removing people, which makes them a single source of truth for downstream automation no matter how the person entered your workspace.
```javascript theme={null}
async function onTeammateEvent(event) {
const primary = event.emails.find((e) => e.primary) ?? event.emails[0];
if (event.type === "teammate.created") {
await itsm.createTask({
title: `Onboarding: ${event.teammate.display_name}`,
assignee: "it-team",
body: `Scribe teammate created for ${primary.address}. Confirm their signature installs.`,
});
return;
}
// teammate.deleted is your last chance to read their identifiers.
await directory.markOffboarded({
teammateUuid: event.teammate.uuid,
email: primary.address,
offboardedAt: event.occurred_at,
});
}
```
The deletion payload includes the emails and uuid of the person being removed, which the API can no longer return once they are gone. Store what you need from the payload itself rather than planning a follow-up fetch.
## Track campaign status when banners go live
Subscribe to the five `campaign` events to follow a banner from scheduled to archived. They share one payload, so a single handler covers the whole lifecycle. The common pattern is a Slack post when a banner starts and ends, plus an annotation pushed into your analytics tool so the traffic spike has a label the next time somebody asks what caused it.
```javascript theme={null}
const CAMPAIGN_EVENTS = new Set([
"campaign.scheduled",
"campaign.started",
"campaign.paused",
"campaign.resumed",
"campaign.ended",
]);
async function onCampaignEvent(event) {
if (!CAMPAIGN_EVENTS.has(event.type)) return;
const { campaign } = event;
if (event.type === "campaign.started" || event.type === "campaign.ended") {
await analytics.createAnnotation({
label: `${campaign.name} ${event.type === "campaign.started" ? "live" : "ended"}`,
timestamp: event.occurred_at,
templates: campaign.signature_template_uuids,
});
}
await slack.post("#marketing", `${campaign.name} is now ${campaign.status}`);
}
```
Start and end transitions are detected on a schedule, so `occurred_at` can trail the campaign's own `start_time` by a few minutes. Use `start_time` and `end_time` from the payload when you need the intended schedule, and `occurred_at` when you need the moment the change actually took effect.
## Connect Scribe webhooks to Zapier, Make, or n8n
You do not need a server to use Scribe webhooks. Zapier, Make, and n8n each give you a catch hook URL you can register as an endpoint, which turns any Scribe event into a step in a workflow. It is the fastest path from event to spreadsheet row, ticket, or notification.
In Zapier, Make, or n8n, add a webhook trigger and copy the URL it gives you.
Open **Settings → Webhooks**, click **Manage webhooks**, add the URL, and subscribe it to the events that workflow needs.
Use the portal's test feature to send a sample event, so your tool can learn the payload shape before you build the rest of the steps.
Point `event.type` at a router step, then map fields such as `conversion.value` or `email.address` into the action.
Most automation platforms do not verify webhook signatures for you. Anyone who learns the URL can post to it, so keep these endpoints for low-stakes notifications, or add a verification step before any action that writes to a system of record.
## Keep an audit trail of workspace changes
Subscribe one endpoint to every event type and write each payload to append-only storage, and you get a full workspace history for free: who published which signature and when, which integrations were connected or removed, when each teammate arrived and left. Store the raw JSON plus the `svix-id` and `svix-timestamp` headers, and you can answer compliance questions months later without reconstructing anything.
## Webhook best practices for a reliable receiver
Delivery is at-least-once. The same message can arrive twice, and `svix-id` is stable across retries of it.
Events are delivered independently and can arrive out of order. Sequence on the payload timestamp, never on arrival time.
New event types and new fields are added over time. Handle the types you subscribed to and skip the rest instead of failing.
An outage on your side loses nothing. Fix the endpoint, then replay the failed deliveries from the webhook portal.
## Frequently asked questions
### Do I need to build a server to receive Scribe webhooks?
No. Any HTTPS URL works, including the catch hook URL from an automation platform such as Zapier, Make, or n8n. Build your own endpoint when you need signature verification and control over how failures are retried, which anything writing to a system of record deserves.
### How do I stop the same event from being processed twice?
Deduplicate on the `svix-id` header. Delivery is at-least-once, so a message can occasionally arrive more than once, and that header stays the same across every retry of the same message.
### What happens if my endpoint is down?
Nothing is lost. Failed deliveries are retried automatically with exponential backoff over roughly a day, and endpoints that keep failing are eventually disabled. Once yours is healthy, re-enable it and replay the missed deliveries from the webhook portal.
### Can I test a webhook before sending real traffic to it?
Yes. The webhook portal sends test deliveries to any endpoint and logs the full request and response of every attempt, so you can confirm your verification and routing work before you subscribe to live events.
### Which events fire for a signature that was never installed?
Only `signature.published`. Installation events describe a specific mailbox, so `signature.installation.failed` fires when an install into that mailbox is attempted and fails, not when a template sits unused.
### Who can create webhook endpoints in Scribe?
Workspace owners and admins, on a plan that includes API access. Endpoints are managed from **Settings → Webhooks** in the dashboard, covered in [setting up an endpoint](/webhooks/overview#setting-up-an-endpoint).
## Next steps
Register a URL, verify signatures, and learn the delivery guarantees.
Every event Scribe sends, with a full payload example.
What to build with the REST API, for the workflows you pull instead of receive.
How conversions are recorded and attributed before they reach your endpoint.