# Adding and Removing Sender Emails Source: https://docs.emailbison.com/campaigns/adding-and-removing-sender-emails ## Adding Sender Emails Send a `POST` request to the [following endpoint](https://dedi.emailbison.com/api/reference#tag/campaigns/post/api/campaigns/\{campaign_id}/attach-sender-emails). ```bash theme={null} /api/campaigns/{campaign_id}/attach-sender-emails ``` The request takes 1 required body parameter: An array containing the IDs of the sender emails to add An example of this request: ```bash curl theme={null} curl 'https://dedi.emailbison.com/api/campaigns/6/attach-sender-emails' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \ --data '{ "sender_email_ids": [1,2,3] }' ``` ```JavaScript JavaScript theme={null} fetch('https://dedi.emailbison.com/api/campaigns/6/attach-sender-emails', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer YOUR_SECRET_TOKEN' }, body: JSON.stringify({ sender_email_ids: [1, 2, 3] }) }) ``` ```Python Python theme={null} headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_SECRET_TOKEN', } json_data = { 'sender_email_ids': [1,2,3,], } response = requests.post('https://dedi.emailbison.com/api/campaigns/6/attach-sender-emails', headers=headers, json=json_data) ``` ## Removing Sender Emails Send a `DELETE` request to the [following endpoint](https://dedi.emailbison.com/api/reference#tag/campaigns/delete/api/campaigns/\{campaign_id}/remove-sender-emails). ```bash theme={null} /api/campaigns/{campaign_id}/remove-sender-emails ``` The request takes 1 required body parameter: An array containing the IDs of the sender emails to add An example of this request: ```bash curl theme={null} curl 'https://dedi.emailbison.com/api/campaigns/6/remove-sender-emails' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \ --data '{ "sender_email_ids": [1,2,3] }' ``` ```JavaScript JavaScript theme={null} fetch('https://dedi.emailbison.com/api/campaigns/6/remove-sender-emails', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer YOUR_SECRET_TOKEN' }, body: JSON.stringify({ sender_email_ids: [1, 2, 3] }) }) ``` ```Python Python theme={null} headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_SECRET_TOKEN', } json_data = { 'sender_email_ids': [1,2,3,], } response = requests.post('https://dedi.emailbison.com/api/campaigns/6/remove-sender-emails', headers=headers, json=json_data) ``` # Adding Leads to a Campaign Source: https://docs.emailbison.com/campaigns/adding-leads-to-a-campaign ## Adding Leads Adding leads to an active campaign will take up to 5 minutes for the leads to get synced. This ensures that there is no interruption to the campaigns sending. ### Adding leads from existing list Send a `POST` request to the [following endpoint](https://dedi.emailbison.com/api/reference#tag/campaigns/post/api/campaigns/\{campaign_id}/leads/attach-lead-list). ```bash theme={null} /api/campaigns/{campaign_id}/leads/attach-lead-list ``` The request takes 1 required body parameter: The ID of the lead list to add An example of this request: ```bash curl theme={null} curl 'https://dedi.emailbison.com/api/campaigns/6/leads/attach-lead-list' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \ --data '{ "lead_list_id": 1 }' ``` ```JavaScript JavaScript theme={null} fetch('https://dedi.emailbison.com/api/campaigns/6/leads/attach-lead-list', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer YOUR_SECRET_TOKEN' }, body: JSON.stringify({ lead_list_id: 1 }) }) ``` ```Python Python theme={null} headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_SECRET_TOKEN', } json_data = { 'lead_list_id': 1, } response = requests.post( 'https://dedi.emailbison.com/api/campaigns/6/leads/attach-lead-list', headers=headers, json=json_data, ) ``` ### Adding leads by their IDs You can also add individual leads to a campiagn using the lead IDs. Send a `POST` request to the [following endpoint](https://dedi.emailbison.com/api/reference#tag/campaigns/post/api/campaigns/\{campaign_id}/leads/attach-leads). ```bash theme={null} /api/campaigns/{campaign_id}/leads/attach-leads ``` The request takes 1 required body parameter: An array containing the IDs of the leads to add An example of this request: ```bash curl theme={null} curl 'https://dedi.emailbison.com/api/campaigns/6/leads/attach-leads' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \ --data '{ "lead_ids": [1,2,3] }' ``` ```JavaScript JavaScript theme={null} fetch('https://dedi.emailbison.com/api/campaigns/6/leads/attach-leads', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer YOUR_SECRET_TOKEN' }, body: JSON.stringify({ lead_ids: [1, 2, 3] }) }) ``` ```Python Python theme={null} headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_SECRET_TOKEN', } json_data = { 'lead_ids': [1,2,3,], } response = requests.post('https://dedi.emailbison.com/api/campaigns/6/leads/attach-leads', headers=headers, json=json_data) ``` Navigate to `Campaigns`. Click on the campaign you want to add leads to. Click the `Actions` dropdown and click `Add more contacts`. # Creating Campaigns Source: https://docs.emailbison.com/campaigns/creating-campaigns This page will walk you through creating a campaign from the API. ### Creating a Campaign Send a `POST` request to `/api/campaigns`. You must pass 1 body parameter, `name`, which corresponds to the name of the campaign you wish to create. If successful, you will receive a a `200 OK` with the campaign ID as part of the response. ### Campaign Settings You can get the ID for a campaign using the UI by navigating to the campaign, clicking on the `Actions` dropdown, and then clicking `Copy ID for API`. Alternatively, campaign IDs can be acquired with a `GET` request to `/api/campaigns`. Each campaign has individual settings that can be changed. You can view the settings with a `GET` request to `/api/campaigns/{id}` where `{id}` is the campaign ID. If you need to change the settings, send a `PATCH` request to `/api/campaigns/{id}/update` where `{id}` is the campaign ID. The maxiumum number of emails that can be sent per day The maximum number of new leads that can be added per day. Whether the email content should be plain text. If nothing sent, false is assumed Whether open tracking should be enabled for the campaign. If nothing sent, false is assumed. Spam protection. If nothing sent, false is assumed. Whether recipients can unsubscribe from the campaign using a one-click link. If nothing sent, false is assumed. The text that will be shown in the unsubscribe link. ```bash curl theme={null} curl 'https://dedi.emailbison.com/api/campaigns/{id}/update' \ --request PATCH \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \ --data '{ "max_emails_per_day": 500, "max_new_leads_per_day": 100, "plain_text": true, "open_tracking": true, "reputation_building": true, "can_unsubscribe": true, "unsubscribe_text": "Click here to unsubscribe" }' ``` ```JavaScript JavaScript theme={null} fetch('https://dedi.emailbison.com/api/campaigns/{id}/update', { method: 'PATCH', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer YOUR_SECRET_TOKEN' }, body: JSON.stringify({ max_emails_per_day: 500, max_new_leads_per_day: 100, plain_text: true, open_tracking: true, reputation_building: true, can_unsubscribe: true, unsubscribe_text: 'Click here to unsubscribe' }) }) ``` ```Python Python theme={null} url = "https://dedi.emailbison.com/api/campaigns/{id}/update" payload = { "max_emails_per_day": 500, "max_new_leads_per_day": 100, "plain_text": True, "open_tracking": True, "reputation_building": True, "can_unsubscribe": True, "unsubscribe_text": "Click here to unsubscribe" } headers = { "Content-Type": "application/json", "Authorization": "Bearer YOUR_SECRET_TOKEN" } response = requests.patch(url, json=payload, headers=headers) ``` ### Campaign Schedule If you have created a schedule for a campaign in the past, you can re-use it provided you've saved it as a template. **If you have a schedule template you wish to use**: Get the schedule ID by sending a `GET` request to `/api/campaigns/schedule/templates`. Once you've acquired the ID, send a `POST` to `/api/campaigns/{campaign_id}/create-schedule-from-template`. The request requires 1 body field, `schedule_id`, which is the ID of the schedule you want to use. **If you don't have a schedule template you wish to use**: If you don't have any templates, or wish to create a new one, send a `POST` request to `/api/campaigns/{campaign_id}/schedule`. Whether the schedule includes Monday. Whether the schedule includes Tuesday. Whether the schedule includes Wednesday. Whether the schedule includes Thursday. Whether the schedule includes Friday. Whether the schedule includes Saturday. Whether the schedule includes Sunday. The start time in HH:MM format. Example: `09:00` The end time in HH:MM format. Example: `17:00` The timezone of the schedule. You need to use the formatted string after the `=>` symbol. e.g. "America/Los\_Angeles" (GMT-12:00) International Date Line West => **Pacific/Kwajalein** (GMT-11:00) Midway Island => **Pacific/Midway** (GMT-11:00) Samoa => **Pacific/Apia** (GMT-10:00) Hawaii => **Pacific/Honolulu** (GMT-09:00) Alaska => **America/Anchorage** (GMT-08:00) Pacific Time (US & Canada) => **America/Los\_Angeles** (GMT-08:00) Tijuana => **America/Tijuana** (GMT-07:00) Arizona => **America/Phoenix** (GMT-07:00) Mountain Time (US & Canada) => **America/Denver** (GMT-07:00) Chihuahua => **America/Chihuahua** (GMT-07:00) La Paz => **America/Chihuahua** (GMT-07:00) Mazatlan => **America/Mazatlan** (GMT-06:00) Central Time (US & Canada) => **America/Chicago** (GMT-06:00) Central America => **America/Managua** (GMT-06:00) Guadalajara => **America/Mexico\_City** (GMT-06:00) Mexico City => **America/Mexico\_City** (GMT-06:00) Monterrey => **America/Monterrey** (GMT-06:00) Saskatchewan => **America/Regina** (GMT-05:00) Eastern Time (US & Canada) => **America/New\_York** (GMT-05:00) Indiana (East) => **America/Indiana/Indianapolis** (GMT-05:00) Bogota => **America/Bogota** (GMT-05:00) Lima => **America/Lima** (GMT-05:00) Quito => **America/Bogota** (GMT-04:00) Atlantic Time (Canada) => **America/Halifax** (GMT-04:00) Caracas => **America/Caracas** (GMT-04:00) La Paz => **America/La\_Paz** (GMT-04:00) Santiago => **America/Santiago** (GMT-03:30) Newfoundland => **America/St\_Johns** (GMT-03:00) Brasilia => **America/Sao\_Paulo** (GMT-03:00) Buenos Aires => **America/Argentina/Buenos\_Aires** (GMT-03:00) Georgetown => **America/Argentina/Buenos\_Aires** (GMT-03:00) Greenland => **America/Godthab** (GMT-02:00) Mid-Atlantic => **America/Noronha** (GMT-01:00) Azores => **Atlantic/Azores** (GMT-01:00) Cape Verde Is. => **Atlantic/Cape\_Verde** (GMT) Casablanca => **Africa/Casablanca** (GMT) Dublin => **Europe/London** (GMT) Edinburgh => **Europe/London** (GMT) Lisbon => **Europe/Lisbon** (GMT) London => **Europe/London** (GMT) Monrovia => **Africa/Monrovia** (GMT+01:00) Amsterdam => **Europe/Amsterdam** (GMT+01:00) Belgrade => **Europe/Belgrade** (GMT+01:00) Berlin => **Europe/Berlin** (GMT+01:00) Bern => **Europe/Berlin** (GMT+01:00) Bratislava => **Europe/Bratislava** (GMT+01:00) Brussels => **Europe/Brussels** (GMT+01:00) Budapest => **Europe/Budapest** (GMT+01:00) Copenhagen => **Europe/Copenhagen** (GMT+01:00) Ljubljana => **Europe/Ljubljana** (GMT+01:00) Madrid => **Europe/Madrid** (GMT+01:00) Paris => **Europe/Paris** (GMT+01:00) Prague => **Europe/Prague** (GMT+01:00) Rome => **Europe/Rome** (GMT+01:00) Sarajevo => **Europe/Sarajevo** (GMT+01:00) Skopje => **Europe/Skopje** (GMT+01:00) Stockholm => **Europe/Stockholm** (GMT+01:00) Vienna => **Europe/Vienna** (GMT+01:00) Warsaw => **Europe/Warsaw** (GMT+01:00) West Central Africa => **Africa/Lagos** (GMT+01:00) Zagreb => **Europe/Zagreb** (GMT+02:00) Athens => **Europe/Athens** (GMT+02:00) Bucharest => **Europe/Bucharest** (GMT+02:00) Cairo => **Africa/Cairo** (GMT+02:00) Harare => **Africa/Harare** (GMT+02:00) Helsinki => **Europe/Helsinki** (GMT+02:00) Istanbul => **Europe/Istanbul** (GMT+02:00) Jerusalem => **Asia/Jerusalem** (GMT+02:00) Kyev => **Europe/Kiev** (GMT+02:00) Minsk => **Europe/Minsk** (GMT+02:00) Pretoria => **Africa/Johannesburg** (GMT+02:00) Riga => **Europe/Riga** (GMT+02:00) Sofia => **Europe/Sofia** (GMT+02:00) Tallinn => **Europe/Tallinn** (GMT+02:00) Vilnius => **Europe/Vilnius** (GMT+03:00) Baghdad => **Asia/Baghdad** (GMT+03:00) Kuwait => **Asia/Kuwait** (GMT+03:00) Moscow => **Europe/Moscow** (GMT+03:00) Nairobi => **Africa/Nairobi** (GMT+03:00) Riyadh => **Asia/Riyadh** (GMT+03:00) St. Petersburg => **Europe/Moscow** (GMT+03:00) Volgograd => **Europe/Volgograd** (GMT+03:30) Tehran => **Asia/Tehran** (GMT+04:00) Abu Dhabi => **Asia/Muscat** (GMT+04:00) Baku => **Asia/Baku** (GMT+04:00) Muscat => **Asia/Muscat** (GMT+04:00) Tbilisi => **Asia/Tbilisi** (GMT+04:00) Yerevan => **Asia/Yerevan** (GMT+04:30) Kabul => **Asia/Kabul** (GMT+05:00) Ekaterinburg => **Asia/Yekaterinburg** (GMT+05:00) Islamabad => **Asia/Karachi** (GMT+05:00) Karachi => **Asia/Karachi** (GMT+05:00) Tashkent => **Asia/Tashkent** (GMT+05:30) Chennai => **Asia/Kolkata** (GMT+05:30) Kolkata => **Asia/Kolkata** (GMT+05:30) Mumbai => **Asia/Kolkata** (GMT+05:30) New Delhi => **Asia/Kolkata** (GMT+05:45) Kathmandu => **Asia/Kathmandu** (GMT+06:00) Almaty => **Asia/Almaty** (GMT+06:00) Astana => **Asia/Dhaka** (GMT+06:00) Dhaka => **Asia/Dhaka** (GMT+06:00) Novosibirsk => **Asia/Novosibirsk** (GMT+06:00) Sri Jayawardenepura => **Asia/Colombo** (GMT+06:30) Rangoon => **Asia/Rangoon** (GMT+07:00) Bangkok => **Asia/Bangkok** (GMT+07:00) Hanoi => **Asia/Bangkok** (GMT+07:00) Jakarta => **Asia/Jakarta** (GMT+07:00) Krasnoyarsk => **Asia/Krasnoyarsk** (GMT+08:00) Beijing => **Asia/Hong\_Kong** (GMT+08:00) Chongqing => **Asia/Chongqing** (GMT+08:00) Hong Kong => **Asia/Hong\_Kong** (GMT+08:00) Irkutsk => **Asia/Irkutsk** (GMT+08:00) Kuala Lumpur => **Asia/Kuala\_Lumpur** (GMT+08:00) Perth => **Australia/Perth** (GMT+08:00) Singapore => **Asia/Singapore** (GMT+08:00) Taipei => **Asia/Taipei** (GMT+08:00) Ulaan Bataar => **Asia/Irkutsk** (GMT+08:00) Urumqi => **Asia/Urumqi** (GMT+09:00) Osaka => **Asia/Tokyo** (GMT+09:00) Sapporo => **Asia/Tokyo** (GMT+09:00) Seoul => **Asia/Seoul** (GMT+09:00) Tokyo => **Asia/Tokyo** (GMT+09:00) Yakutsk => **Asia/Yakutsk** (GMT+09:30) Adelaide => **Australia/Adelaide** (GMT+09:30) Darwin => **Australia/Darwin** (GMT+10:00) Brisbane => **Australia/Brisbane** (GMT+10:00) Canberra => **Australia/Sydney** (GMT+10:00) Guam => **Pacific/Guam** (GMT+10:00) Hobart => **Australia/Hobart** (GMT+10:00) Melbourne => **Australia/Melbourne** (GMT+10:00) Port Moresby => **Pacific/Port\_Moresby** (GMT+10:00) Sydney => **Australia/Sydney** (GMT+10:00) Vladivostok => **Asia/Vladivostok** (GMT+11:00) Magadan => **Asia/Magadan** (GMT+11:00) New Caledonia => **Asia/Magadan** (GMT+11:00) Solomon Is. => **Asia/Magadan** (GMT+12:00) Auckland => **Pacific/Auckland** (GMT+12:00) Fiji => **Pacific/Fiji** (GMT+12:00) Kamchatka => **Asia/Kamchatka** (GMT+12:00) Marshall Is. => **Pacific/Fiji** (GMT+12:00) Wellington => **Pacific/Auckland** (GMT+13:00) Nuku\alofa => **Pacific/Tongatapu** Whether the created schedule should be saved as template. ```bash curl theme={null} curl 'https://dedi.emailbison.com/api/campaigns/{campaign_id}/schedule' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \ --data '{ "monday": true, "tuesday": true, "wednesday": true, "thursday": true, "friday": true, "saturday": false, "sunday": false, "start_time": "09:00", "end_time": "17:00", "timezone": "America/New_York", "save_as_template": false }' ``` ```JavaScript JavaScript theme={null} fetch('https://dedi.emailbison.com/api/campaigns/{campaign_id}/schedule', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: 'Bearer YOUR_SECRET_TOKEN' }, body: JSON.stringify({ monday: true, tuesday: true, wednesday: true, thursday: true, friday: true, saturday: false, sunday: false, start_time: '09:00', end_time: '17:00', timezone: 'America/New_York', save_as_template: false }) }) ``` ```Python Python theme={null} import requests url = "https://dedi.emailbison.com/api/campaigns/%7Bcampaign_id%7D/schedule" payload = { "monday": True, "tuesday": True, "wednesday": True, "thursday": True, "friday": True, "saturday": False, "sunday": False, "start_time": "09:00", "end_time": "17:00", "timezone": "America/New_York", "save_as_template": False } headers = { "Content-Type": "application/json", "Authorization": "Bearer YOUR_SECRET_TOKEN" } response = requests.post(url, json=payload, headers=headers) ``` ### Campaign Sequence The sequence of the campaign is the emails that will be sent out. To create your sequence, send a `POST` request to `/api/campaigns/{campaign_id}/sequence-steps`. The request can take only 2 fields in the body JSON. `title` and `sequence_steps`. `title` is a string, and `sequence_steps` is an array that contains the following fields: The title of the sequence The subject of the email. To include variables, type in them in uppercase and wrap them with curly braces. Note that these variables must exist as custom variables in your workspace. Example: `"This is an email subject with a {VARIABLE}."` The body of the email. To include variables, type in them in uppercase and wrap them with curly braces. Note that these variables must exist as custom variables in your workspace. Example: `"This is an email body with a {VARIABLE}."` How many days before the sequence moves to the next step. Whether the step is a variant Required if `variant` is true. The ID of the step this step is a variant of. You can get the step IDs with a `GET` request to \`/api/campaigns//sequence-steps. Whether the step should be a reply from the previous step. The request will look like the following example: ```bash curl theme={null} curl 'https://dedi.emailbison.com/api/campaigns/{campaign_id}/sequence-steps' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \ --data '{ "title": "test sequence", "sequence_steps": [ { "email_subject": "Hey {FIRST_NAME}", "order": 1, "email_body": "You should check this {PRODUCT] out!", "wait_in_days": 1, "variant": true, "variant_from_step": 223 }, { "email_subject": "EmailBison is awesome!", "order": 2, "email_body": "Try it now!", "wait_in_days": 1, "variant": true, "variant_from_step": 1, "thread_reply": true } ] }' ``` ```JavaScript JavaScript theme={null} fetch('https://dedi.emailbison.com/api/campaigns/{campaign_id}/sequence-steps', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_SECRET_TOKEN' }, body: JSON.stringify({ 'title': 'test sequence', 'sequence_steps': [ { 'email_subject': 'Hey {FIRST_NAME}', 'order': 1, 'email_body': 'You should check this {PRODUCT] out!', 'wait_in_days': 1, 'variant': true, 'variant_from_step': 223 }, { 'email_subject': 'EmailBison is awesome!', 'order': 2, 'email_body': 'Try it now!', 'wait_in_days': 1, 'variant': true, 'variant_from_step': 1, 'thread_reply': true } ] }) }); ``` ```Python Python theme={null} import requests headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_SECRET_TOKEN', } json_data = { 'title': 'test sequence', 'sequence_steps': [ { 'email_subject': 'Hey {FIRST_NAME}', 'order': 1, 'email_body': 'You should check this {PRODUCT] out!', 'wait_in_days': 1, 'variant': True, 'variant_from_step': 223, }, { 'email_subject': 'EmailBison is awesome!', 'order': 2, 'email_body': 'Try it now!', 'wait_in_days': 1, 'variant': True, 'variant_from_step': 1, 'thread_reply': True, }, ], } response = requests.post( 'https://dedi.emailbison.com/api/campaigns/{campaign_id}/sequence-steps', headers=headers, json=json_data, ) ``` ### Launching Campaign After creating a campaign, updating its settings, creating or choosing a schedule, and creating a sequence, you have completed all the necessary steps in creating a campaign. You can send these requests to check the details of a campaign: * `GET /api/campaigns/{campaign_id}`: retrieves the campaign you created and its settings. * `GET /api/campaigns/{campaign_id}/schedule`: retreives the campaign schedule. * `GET /api/campaigns/{campaign_id}/sequence-steps`: retrieves the campaign sequences steps. **Once you're ready to launch your campaign, send a `PATCH` request to `/api/campaigns/{campaign_id}/resume`.** You can pause the campaign by sending a `PATCH` request to `/api/campaigns/{campaign_id}/pause`. # Overview Source: https://docs.emailbison.com/campaigns/overview Campaigns orchestrate the emails that will be sent, who they will be sent to, and when they will be sent. ## Campaign Scheduler The campaign scheduler will run and schedule emails to be sent out every time the campaign is resumed, as well as at the end of every sending day for the campaign. If you need to manually run the campaings scheduler before the end of the sending day, you can pause and resume the campaign. ## Smart Scheduling EmailBison uses a smart scheduling pattern to avoid automation detection. Campaign emails are sent on a random pattern throughout your sending window -- decided by the campaign's `schedule`. ## ESP Matching EmailBison takes an unopinionated approach to ESP matching. It is left to the user to decide if ESP matching or mis-matching is better for their deliverablity. EmailBison provides you with the tools to achieve this by tagging every [lead](/leads/overview#esp-tagging) with their ESP. ## Relationship between Leads and Sender Emails Once a lead has been sent an email in a campaign, the same Sender Email will send the remaining steps for that lead, as well as emails sent to the lead from a followup campaign. # Adding Sender Emails Source: https://docs.emailbison.com/email-accounts/adding-accounts ## Bulk Uploading There are multiple ways to bulk upload accounts to EmailBison. ### Custom SMTP Providers (Emails not with Microsoft or Google) Send a `POST` request to the [following endpoint](https://dedi.emailbison.com/api/reference#tag/email-accounts/post/api/sender-emails/imap-smtp). ```bash theme={null} /api/sender-emails/imap-smtp ``` The `Content-Type` header key should be set to `multipart/form-data`. The only parameter you must provide out is `csv`, and the value should be your CSV file. An example of this request: ```bash curl theme={null} curl https://dedi.emailbison.com/api/sender-emails/bulk \ --request POST \ --header 'Content-Type: multipart/form-data' \ --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \ --data "{"csv":""}" ``` ```JavaScript JavaScript theme={null} fetch('https://dedi.emailbison.com/api/sender-emails/bulk', { method: 'POST', headers: { 'Content-Type': 'multipart/form-data', Authorization: 'Bearer YOUR_SECRET_TOKEN' }, body: '{'csv':''}' }) ``` ```Python Python theme={null} url = 'https://dedi.emailbison.com/api/sender-emails/bulk' payload = {'csv':'csv'} headers = { 'Content-Type': 'multipart/form-data', 'Authorization': 'Bearer YOUR_SECRET_TOKEN' } response = requests.post(url, data=payload, headers=headers) print(response.json()) ``` Navigate to `Email Accounts` -> `Connect Email Account` -> `Bulk Upload Custom Provider` Download and refer to the sample CSV file for proper CSV formatting. *** ### Microsoft Accounts The EmailBison team has built and released a native program to bulk upload Microsoft accounts. The download and all instructions can be found on the [Bulk Uploader Tool](/email-accounts/bulk-uploader-tool) page. ### Google Accounts Bulk uploading Google accounts is currently not first-party supported due to the frequent captcha requirements by Google. # Changelog Source: https://docs.emailbison.com/email-accounts/bulk-uploader-tool/changelog Bulk Uploader Tool Changelog ## EmailGuard Compatibility; Tagging Fix * Updated EmailGuard mode to work on new layout. * Added new flag `--emailguard-prompt-login` and the equivalent advanced option. * Intended for advanced usage, in almost all cases this should be left as `false / no`. * Fixed issue causing email tagging to not correctly trigger. ## Support for Admin Consent Prompt * This update is required for the new EmailBison "Admin Consent Prompt" Option. Backwards compatibility is maintained. * You can now provide an optional `use_as_admin` column in your CSV file, which will cause the uploader to check "Admin Consent Prompt" on the EmailBIson Page. * Fixed issue with workspace name not being read properly. * Stability Improvements. ## Minor maintenance patch. * This update is a minor maintenance patch. ## Minor enhancements. * The tool has better selectors for the EmailBison connect page. This update is needed in cases where the layout has changed. * Fixed an issue where the tool would say the API key is not correct for the workspace, when it is. ## Minor enhancements. * Will now stop on wrong Microsoft username in `rod` driver. * Will now display account timeouts ("context deadline exceeded") as failures. * Explained the "context deadline exceeded" error. ## Minor bug fixes. * Fixed edge case in `rod` driver where microsoft password page would time out. * The average time per account display was rounded, it now displays with 2 decimal places. * Fixed wording for `--help` flag output. ## GUI Overhaul. New Driver. Flag Options in GUI. This update is a large overhaul of the tool, read below to learn what's been changed: #### What's new: * Brand-new user interface (see image above)! The interface looks more pleasing, offers more functionality, and is easier to use. * You can now set any flag option directly from the GUI just by following the prompts, you can skip learning how to launch the tool from the terminal and pass flags! * Users who choose to use flags have not been forgotten. Interaction flags have been deprecated for a more intuitive `--non-interactive` flag! This flag removes all input prompts and allows you to integrate the tool with your other automations painlessly. The list of deprecated flags can be found at the end of these update notes. * Only failures will now be printed to the terminal, and to supplement this, you will have a running count of processed accounts, successful accounts, and failed accounts. This will reduce noise output and help you identify at a glance which accounts failed. * The output CSV file will now only include failures. This allows you to re-run only failed accounts without an API key, by running the tool again on the output file. * A new "driver" (the tech that controls the browsers) has been introduced, with promising internal testing. The new driver is selected by default. Users can opt for the old driver either from the GUI or by passing in a `--driver` flag. #### Deprecated features and flags The "reconnect existing accounts" prompt and flag have both been removed. This setting has been replaced by the "skip connected accounts if they exist" setting, which will still sign in to existing accounts in a disconnected state, which is a better workflow. The following flags have been removed in favor of the intuitive `--non-interactive` flag. * `--skip-api-key-warning` * `--skip-workspace-prompt` The following flag has been removed. * `--connect-existing-accounts` #### Behaviour Changes The following flag has been renamed, and changed to a boolean, `false` by default. * ~~`--connect-disconnected-accounts-only`~~ => `--skip-connected-accounts` #### Bug fixes * Fixed `Ctrl+C` behaviour. You should be able to hit `Ctrl+C` at any time to stop the tool without unexpected behaviour. * Fixed incomplete CSV output, and accounts not being tagged, if the tool is stopped before processing all accounts. * Fixed a case where failures on accounts would have an empty message. * Fixed dragging a CSV file on the tool causing issues if flags were passed. * Fixed edge case where user was still prompted when the non-interactive flags were passed. ## V2 support. New features. Improved success rate. The EmailBison Bulk Uploader has been improved and many new features have been added. What's new: * The tool is updated to work on the EmailBison v2 beta! The tool will auto detect if it should run on v1 or v2 EmailBison, or EmailGuard. * New feature: only process accounts that are "not connected" on EmailBison (requires API key). * New feature (beta): You can now drop csv files directly into the executable instead of picking from the file picker. * Many bug fixes, resulting in much higher success rate. Tested with --browsers 20 (spawning 20 browsers at once instead of the default 6), when RAM was fully used and macbook had to use swap for all new browsers, 100% success rate. * Better error messages all around -- no more "SMTP error", instead, you get the EmailBison error, such as "Email already exists on another workspace: John's Team". * New flags added (run the tool with -help from the terminal to see all flags): * `csv-file` -- \[interaction] specify a path to a csv file to skip file picker prompt, works like the `config-file` flag. * `skip-workspace-prompt` -- \[interaction] skips prompt for confirming the workspace. * `skip-api-key-warning` -- \[interaction] skips prompt for continuing without an API key. * `connect-existing-accounts` -- \[interaction] skips prompt by answering in advance whether to connect existing accounts. * `connect-disconnected-accounts-only` -- \[interaction] skips prompt by answering in advance whether to connect disconnected accounts only. * `force-bison-v1` -- forces tool into EmailBison v1 mode, if auto-detection fails. * `force-bison-v2` -- forces tool into EmailBison v2 mode, if auto-detection fails. The \[interaction] flags will allow the tool to run without any user input. # Overview Source: https://docs.emailbison.com/email-accounts/bulk-uploader-tool/overview The EmailBison team provides executables for uploading Microsoft accounts to EmailBison on Windows, macOS, and Linux . The latest version of the tool can be downloaded here: The executable for Windows The binary for macOS The binary for Linux Your browser could block this download. Right click on one of the cards and click `Save as` or `Save link as`. ## Using the tool In the zip file you downloaded, you will find instructions on using the tool in `how_to_use.txt`. Alternatively, you can watch a walkthrough of using the tool in action: