diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000000..ea94c7be2b --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,51 @@ + +engines: + fixme: + enabled: false + rubocop: + enabled: true + channel: rubocop-0-49 + duplication: + enabled: true + complexity: + enabled: false + markdownlint: + enabled: true + +exclude_paths: + - .bowerrc + - .codeclimate.yml + - .dockerignore + - .gitignore + - .nvmrc + - .rspec + - .rubocop.yml + - .spelling + - .travis.yml + - Gemfile.lock + - CODE_OF_CONDUCT.md + - CONTRIBUTING.md + - README.markdown + - license + - linklint-2.3.5 + - linklint_command + - pacakge-lock.json + - package.json + - Rakefile + - Vagrantfile + - config.sample.yml + - bower.json + - gulfile.js + - .github/**/* + - bin/**/* + - config/**/* + - gulp/**/* + - script/**/* + - public/**/* + - source/assets/**/* + - plugins/**/* + +ratings: + paths: + - lib/**/*.rb + - "**.md" diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..facf1a5649 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,26 @@ +.vagrant/ +.jekyll_indextank/ +.rvmrc +_config.yml +_config.dev.yml +_config.deploy.yml +.bundle +.DS_Store +.sass-cache +.gist-cache +.idea +.pygments-cache +_deploy +sass.old +source.old +source/_stash +source/stylesheets/screen.css +vendor +node_modules +pdf +public +linklint_logs +bower_components +source/_assets/bower_components +source/.asset_pipeline +npm-debug.log diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE index 55310c077a..fdb5d82890 100644 --- a/.github/PULL_REQUEST_TEMPLATE +++ b/.github/PULL_REQUEST_TEMPLATE @@ -1,17 +1,8 @@ - - **Description of the change**: **Reason for the change**: **Link to original source**: + +Closes # -@ksigler7 diff --git a/.gitignore b/.gitignore index 41e4a6e468..bb8037b9ea 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ linklint_logs bower_components source/_assets/bower_components source/.asset_pipeline +npm-debug.log +package-lock.json diff --git a/.spelling b/.spelling new file mode 100644 index 0000000000..f68d06d3e5 --- /dev/null +++ b/.spelling @@ -0,0 +1,1577 @@ +#ff0000 +.csv +.se +0 +0.0.1 +0.25 +0.333 +0.4.6 +0.4.7 +000-messages +0000ff +00am +01.subdomain.yourdomain.com +0s +1 +1-10 +1.0 +1.0 +1.0.0 +1.1 +1.10.5 +1.10.x +1.11.x +1.3 +1.9.0 +1.9.3 +10-year-old +10.4 +10.50 +100k +12.12 +12.34.56.78 +123.123 +127.0.0.1 +127.0.0.1 +14-day +150.000 +19.95 +198.37.144.225 +198.37.147.135 +1s +2 +2.0 +2.0.0 +2.6.5 +2.x +200-300k +2011-2014 +255.255.253.0 +255.255.255.250 +255.255.255.250 +255.255.255.250 +255.255.255.250 +255.255.255.251 +255.255.255.251 +255.255.255.251 +255.255.255.251 +255.255.255.251 +255.255.255.251 +255.255.255.251 +255.255.255.251 +255.255.255.252 +255.255.255.252 +255.255.255.252 +255.255.255.252 +255.255.255.253 +255.255.255.253 +255.255.255.253 +255.255.255.253 +255.255.255.254 +255.255.255.254 +255.255.255.254 +255.255.255.254 +3 +3.2.1 +3.8 +3.x +30-day +33.3 +35am +3kb +3px +4 +4.16.1 +4.16.50 +4.16.50 +4.2.2 +4.3.1 +4.5.2 +4.7.0 +4.x.x +400-style +5 +5.0 +5.1.1 +5.1.1 +5.2.2 +5.3 +5.4 +5.5 +5.5.x +5.6 +5.6. +5.7.1 +5.x.x +500-style +6 +6.0 +6.0 +6.0 +64-bit +7 +7-10 +7.0 +7.1 +7.1. +7.5 +7.5 +72hrs +7bit +7kb +8 +9 +9.95 +Tsiukhtsiayeu +X.X.X.X +_ +_2 +_BATCH +_TLSv1 +__setopt +_address +_api +_apikey +_app +_args +_at +_at +_attachments +_auth +_auto +_better +_buddypress +_button +_category +_charset +_check +_city +_close +_config +_configtype +_content +_contents +_controller.rb +_count +_country +_cpanel +_credential +_customer +_data +_debugger +_decode +_deliveries +_delivery +_disable +_disable_ +_display +_domainkey.yourdomain.com. +_domains +_driver +_edit +_elixir +_email +_email.html.erb +_emails +_enable +_enabled +_encode +_encryption +_errors +_event +_example +_exec +_eximconfig +_failed +_fields +_file +_file.jpg +_files +_filter +_find +_for +_from +_from +_get +_group +_groups +_gun +_header +_here +_hide +_host +_hostnames +_html +_httpheader +_id +_ids +_in +_init +_input +_interfaces +_key +_label +_level +_limit +_list +_local +_logging +_login +_mail +_mailer +_mailer.delivery +_mailer.perform +_mailer.raise +_mailer.smtp +_mailname +_main.cf +_mainname +_management +_maps +_mc +_message +_method +_minimaldns +_mode +_more +_name +_nets +_notifier +_notifier.rb +_of +_oh +_once +_open +_options +_other +_override +_parser +_part +_pass +_passwd +_password +_pool +_port +_post +_postfields +_postfields +_preferences +_preview +_r +_readhost +_recipients +_registrationhtml.php +_registrationtext.php +_relay +_remain +_report +_require +_reset +_returntransfer +_sasl +_schedule +_security +_send +_sendgrid +_sending +_server +_setopt +_settings +_signup +_silently +_size +_smarthost +_smtp +_smtptransport +_songs +_spf.google.com +_split +_sslversion +_starttls +_state +_strategy +_string +_subject +_subscription +_sugar +_template +_text +_time +_timestamp +_tls +_to +_toolkit +_transport +_type +_unique +_unsubscribe +_url +_use +_user +_username +_value +_via +_welcome +_widget +_with +_work +_wpbe +_zip +access.db +actionmailer +ad-hoc +add-ons +addcategory +addfiltersetting +address1 +address2 +address3 +address4 +address5 +addsection +addsmtpapito +addsubstitution +addsubval +addto +ado.net +agiliq +airbnb +alerts.create +alerts.delete +alerts.read +alerts.update +alloc +alon +analytics +anotherdomain.com +aol.com +api +apicontroller +apikey +apis +app.configure +app.get +app.listen +app.listen +app.post +app.route +app.run +app.ruote +app.set +app.use +app.yml +appdirect +applicationcontroller +args +arial +arrays.aslist +aschroder.com +ashroder.com +asjson +asm +asm.groups.create +asm.groups.delete +asm.groups.read +asm.groups.update +asp.net +asusta +async +attachment.read +attachments.append +authinfo +authpass +authuser +authy +autocomplete +autogenerated +autoload.php +autoresponder +autoresponders +backend +backend-as-a-service +balfanz +bar.com +base.smtp +base64 +bcc +bccaddress +bccd +bccs +billing.create +billing.delete +billing.read +billing.update +billing.yourdomain.com +bit.ly +boolean +boolean +bootstrappers +brank +briteverify +browserify +browsers.stats.read +buddypress +build.gradle +bundle-g2-g1 +buyersection +byname +c.api +cafile +cakephp +callebs +cancelbuttontitle +categories.create +categories.delete +categories.read +categories.stats.read +categories.stats.sums.read +categories.update +category1 +category2 +ccaddress0 +ccaddress1 +ccs +cdata +centos +changelog +charset +charsets +checkbox +checkboxes +checkmark +checksum +chmod +clicktrack +clicktracking +client.gettable +client.new +client.send +clients.desktop.stats.read +clients.phone.stats.read +clients.stats.read +clients.tablet.stats.read +clients.webmail.stats.read +cloudflare +cloudrail +cloudrail-si-android +cmd +cmdgrid +cname +cnamelookup +codeigniter +codeigniter-sendgrid-mail +codeigniter-sendgrid-newsletter +coldfusion +com.sendgrid. +comcast +composer.json +conf.conf +config +config.action +config.actoin +config.get +connectionresponse +console.log +cordova +cpanel +credentials.create +credentials.delete +credentials.read +credentials.update +crlf +crt +crupal +css +csv +ctas +ctrs +currentbackend +customerid +customizable +cyrus-sasl-plain +dannysantiago +data.name +data.track +data.user +default.ctp +deletekey +delisted +delisting +desautels +devices.stats.read +dirdel +dirname +distros +django +django-sendgrid-v5 +django.core.mail +dkim +dkim.org +dmarcian +dnl +dns-querying +dnslookup +dnslookup +dnsmadeeasy +domain.com +domain2.com +domainkeys +donut +dotenv +drop-down +dropdown +drupal +drupal.org +drush +dx +e.g. +edmondson +eliksir +em.example.com +em.yourdomain.com +em1 +email.addto +email.domain.com +email.sendemail +email.sendgrid.biz +email.setfrom +email.sethtml +email.setsubject +email.yourdomail.com +email1 +email1 +email2 +email_activity.read +email_activity.read +engineyard +env +env.custom +environment.rb +errored +esps +eventhooks +eventid +eventkit +events.foreach +example.com +example.net +example01 +example02 +example03 +example1 +example2 +example3 +exim +exim's +exim4 +exim4.conf.localmacros +express.bodyparser +facebook +fastly +fehcom's +ff0000 +filename +filepath +filepath +firefox +firstname +fltr +fmt +fname +foreach +form.io +fromname +frontend +func +functions.php +garibay +gatling +gd +geo.stats.read +getemail +getenv +getmailer +getttl +gif +gifs +github +github.com +glyphicons +gmail +godaddy +goodrx +google.com +google.com +google.com. +gradle +granularly +gravatar +greplin-tornado-sendgrid +grey +griddler +gridhook +grossman +gsmtp +gsquire +gzipped +hashtables +hdr +hdr.addto +hdr.asjson +hdr.setcategory +hdr.setuniqueargs +heroku +heya +highlight.js +hostname +hotmail +hotmail +href +html +http +http.handlefunc +http.listenandserve +http.request +http.responsewriter +httpcontext.current.server.mappath +httppost +https +i.e. +idimensionz +ie +img1.jpg +img2.jpg +inbounce +index.html +infosec +infusionsoft +init.d +initwithtitle +interspire +interspire's +inviter +inviter's +inviters +io +ios +ioutil +ip +ip4 +iphone +ips +ips.assigned.read +ips.pools.create +ips.pools.delete +ips.pools.ips.create +ips.pools.ips.delete +ips.pools.ips.read +ips.pools.ips.update +ips.pools.read +ips.pools.update +ips.read +ips.warmup.create +ips.warmup.delete +ips.warmup.read +ips.warmup.update +irc.freenode.net +isps +itemtext.text +jane.doe +jeremie +joe +john.doe +joomla +jpg +jquery +jqueryui.com +js +jsdom +jshint +json +json.generate +json.gsub +jsoneable +jsonlint +jsonlintcompressor +jstorage +justuno +kb +keycdn +knowledgebase +konishi +label.text +laravel +laravel's +laravel-sendgrid-driver +lastname +lefthand +legacymigration +libsasl +libsasl2-modules +lifecycle +listenandserve +listenkeychange +lname +localhost +localizeddescription +log.fatal +logerrorifnotnil +logfiles +lookups +m.from +m.html +m.subject +m.to +m1 +m4 +magento +mail.app +mail.batch.create +mail.batch.delete +mail.batch.read +mail.batch.update +mail.compose.other.header +mail.compose.other.header. +mail.defaults +mail.deliver +mail.new +mail.php +mail.send +mail.send.json +mailables +mailablesusernotifier +mailaddress +mailbox_providers.stats.read +mailhub +mailmessage +mailmsg +mailserver +mailto +mailto +main.cf +makemap +mal.send +manualroute +marketing.yourdomain.com +master.cf +mcafee +message.add +message.set +metadata +mimecast +mmm +modernizr +mootools +msgid +msid +mta1012.mail.gq1.yahoo.com +multer +multipartformdatastreamprovider +multisite +mutablecopy +mx +mx.sendgrid.net +mx.sendgrid.net. +mxtoolbox +mycustomer +myemail +myemail.class.php +myfile +mylocation +mymessage +mymessage.addto +mymessage.from +mymessage.subject +mymessage.text +mysql +namespace +nano +natively +netblocks +netqmail +newinstance +noanonymous +node.js +node.js. +nodejs +npm +nsarray +nsdata +nserror +nshttpurlresponse +nsinteger +nslog +nsstring +nsurlconnection +nsurlrequest +nsutf8stringencoding +nuget +num +o1.subdomain.yourdomain.com +objectforkey +ok +onadd +onedrive +onward +openshift +openssl +options.ttl +ordernumber +otherbuttontitles +outboundconnectioncommand +outlook.com +package.json +pageviews +palatino +param +parameters.yml +params +parse.php +parse.yourdomain.com +passwd +passwd.client +pavel +pci-dss +personalizations +phantomjs +php +phpbb +plaintext +playlist.example.com +portal.azure.com +postgresql +postmap +pre-built +pre-coded +pre-defined +pre-designed +pre-existing +pre-packaged +pre-screen +pre-written +precompiled +preconfigured +preheader +preheaders +preinstalled +preload +prepend +process.env.port +processevent +profile.getemail +profile.getfullname +programmatically +pubsub +pygments +qmail +qstodolistviewcontroller.m +queueable +queueing +quickstart +qunit +rapidapi-sendgrid +rcpthosts +rdns +readmes +readwithcompletion +realtime +recipient0 +recipient1 +recipient2 +recipient3 +recipient4 +recipient5 +recipient6 +recipient7 +recipient8 +recipient9 +redhat +refreshdataonsuccess +registration.ctp +registrationhtml +registrationtext +reinit +relayhost +renfro +repo +req.body +req.body.attachments +req.body.from +req.body.subject +req.body.text +req.files +req.formvalue +request.content.readasmultipartasync +request.files.get +request.form.get +requestwithurl +require.js +responsedata +returningresponse +reupload +reyero +routable +rsa +rubygem +rubygems +rulebook +runtime +rvm-selected +s1.domainkey.uXXX.wlXXX.sendgrid.net. +s1.domainkey.yourdomain.com. +s2.domainkey.uXXX.wlXXX.sendgrid.net. +s2.domainkey.yourdomain.com. +salesforce +sampleapiheader +sampledomain.com. +sasl +sasl_ +saslauthd +sato +schemas +sdks +segment.com +segment.com. +self.table +sellersection +sendas +senddomain.com +sendemail +senderemail +senderip +sendername +sendgrid +sendgrid-csharp +sendgrid-nodejs +sendgrid-perl +sendgrid-webapi-v3-php +sendgrid.cfc +sendgrid.com. +sendgrid.email +sendgrid.info +sendgrid.mail +sendgrid.me +sendgrid.net +sendgrid.net. +sendgrid.newsendgridclientwithapikey +sendgrid.send +sendgrid.sendgridclient +sendgrid.sendgridmessage +sendgrid.web +sendgrid4j +sendgrid4r +sendgridexample +sendgridpassword +sendgrids +sendgridsubscriptionemail +sendgridsubscriptionfirstname +sendgridsubscriptionlastname +sendgridusername +sendmail +sendmail.cf +sendmail.mc +sendsynchronousrequest +serializesmodels +server.address +server.address +server.name +serverless +setbcc +setbody +setbodytext +setcategory +setcategory +setcc +setfrom +setfromname +sethtml +setsubject +settemplateid +settext +settings.py +setto +setttl +setuniqueargs +sfmailer +sg +sgsend +sha-256 +shortcodes +shorteners +shouldqueue +shunji +signup +signups +simplejson +simplejson.loads +simplestorage +sink.sendgrid.net +slmmail +smarthost +smarthost +smtp +smtp.php +smtp.sendgrid.net +smtp.sendgrid.net +smtp.sendgrid.net. +smtpapi +smtpapi-csharp +smtpapi-go +smtpapi-java +smtpapi-nodejs +smtpapi-php +smtpapi-python +smtpapi-ruby +smtpapiheader +smtpapiheader.new +smtpapiheader.rb +smtpauth +smtpmail +smtpoptions +smtproutes +smtpserver +smver +softlayer +solaris +somedomain.com +somewhere.com +spamassassin +spamcop +spamhaus +spammiest +spf +spf.protection.outlook.com +spf1 +spidering +splunk +spoofers +spotify +ssl +sslv3 +ssmtp +ssmtp.conf +stats.global.read +stats.read +stickyhost +stoplistening +storageavailable +storagesize +stringbyaddingpercentescapesusingencoding +stringwithformat +stronggrid +su +sub.domain.tld +sub.example.com +subdomain +subdomain-domain +subdomain.example.com +subdomain.yourdomain.com. +subdomain.yourdomain.com. +subdomains +subsite +subuser +subuser's +subusers +subusers.create +subusers.credits.create +subusers.credits.delete +subusers.credits.read +subusers.credits.remaining.create +subusers.credits.remaining.delete +subusers.credits.remaining.read +subusers.credits.remaining.update +subusers.credits.update +subusers.delete +subusers.monitor.create +subusers.monitor.delete +subusers.monitor.read +subusers.monitor.update +subusers.read +subusers.reputations.read +subusers.stats.monthly.read +subusers.stats.read +subusers.stats.sums.read +subusers.summary.read +subusers.update +sudo +sugarcrm +superglobal +support.yourdomain.com +suppresions +suppression.blocks.create +suppression.blocks.delete +suppression.blocks.read +suppression.blocks.update +suppression.bounces.create +suppression.bounces.delete +suppression.bounces.read +suppression.bounces.update +suppression.create +suppression.delete +suppression.read +suppression.unsubscribes.create +suppression.unsubscribes.delete +suppression.unsubscribes.read +suppression.unsubscribes.update +suppression.update +suppressions +suppressions.create +suppressions.delete +suppressions.read +suppressions.update +swiftmailer +symfony +system.collections.generic +system.linq +system.net +system.net.http +system.net.mail +system.net.mime +system.text +system.threading.tasks +system.web +system.web.http +system32 +systemctl +t.co +teammates.create +teammates.delete +teammates.read +teammates.update +technet +templateid +templates.create +templates.delete +templates.read +templates.update +templates.versions.activate.create +templates.versions.activate.delete +templates.versions.activate.read +templates.versions.activate.update +templates.versions.create +templates.versions.delete +templates.versions.read +templates.versions.update +templating +testemail +testingtextbody +textbox +thoughtbot +ti.sendgrid +timeframe +timeframes +timestamp +tls +tlsmgr +tmp +to.kind +toemail +toname +totalcount +traceroute +tracert +tracking_settings.click.read +transportweb +transportweb.deliverasync +twbootstrap +twilio +u.s. +uXXXXXXX.wlXXX.sendgrid.net +uber +uglifyjs +uialertview +uncheck +unchecking +unencrypted +unique-args +unix +unlicense +unschedule +unscheduling +untrusted +unwhitelabeled +update-exim4 +url +urls +urlwithstring +user.email +user.timezone.read +user.username.read +user.username.update +user.webhooks.event.settings.read +user.webhooks.event.settings.update +user.webhooks.event.test.create +user.webhooks.event.test.read +user.webhooks.event.test.update +user.webhooks.parse.settings.create +user.webhooks.parse.settings.delete +user.webhooks.parse.settings.read +user.webhooks.parse.settings.update +user.webhooks.parse.stats.read +user4 +useremail +userfullname +usernotifier +usernotifier.send +userscontroller +usestarttls +usr +utf-8 +v1.x +v2 +v2.3.2 +v3 +val.instance +validator +varron +versioning +vms +vpns +vukelick +walkthrough +wataru +web.config. +webapi +webhook +webhooks +webpack +webservice--sendgrid +webservices +whitelabel +whitelabel.create +whitelabel.delete +whitelabel.read +whitelabel.update +whitelabeled +whitelabeling +whitelabels +whitelist +whitelisted +whitelisting +whitelists +wildcard +willnotdeliver +winback +windowsazure.mobileserviceclient +wireshark +wisepops +wordpress +wp +wp-config +www +www.example.com +www.jstorage.info +www.modernizr.com +www.mydomain.com +www.openspf.org +www.sendgrid.com +www.sendgrid.com. +x-smtpapi +x-smtpapi-to +xcode +xls +yahoo.at +yahoo.be +yahoo.bg +yahoo.cl +yahoo.co.hu +yahoo.co.id +yahoo.co.il +yahoo.co.kr +yahoo.co.th +yahoo.co.za +yahoo.com.co +yahoo.com.hr +yahoo.com.my +yahoo.com.pe +yahoo.com.ph +yahoo.com.sg +yahoo.com.tr +yahoo.com.tw +yahoo.com.ua +yahoo.com.ve +yahoo.com.vn +yahoo.cz +yahoo.dk +yahoo.ee +yahoo.fi +yahoo.hr +yahoo.hu +yahoo.ie +yahoo.lt +yahoo.lv +yahoo.nl +yahoo.no +yahoo.pl +yahoo.pt +yahoo.rs +yahoo.se +yahoo.si +yahoo.sk +yahoogroups.co.kr +yahoogroups.com.cn +yahoogroups.com.sg +yahoogroups.com.tw +yahoogrupper.dk +yahoogruppi.it +yahooxtra.co.nz +yamil +yepnope.js +yepnopejs.com +ymail.com +your.provider +yourcategory +yourdomain +yourdomain.com +youremail +youremail.com +youremailaddress +yourpassword +yourrecipient +yoursendgridpassword +yoursendgridusername +yourusername +youtube +zapier +zend +zonealias +api_keys.create +api_keys.delete +api_keys.read +api_keys.update +email_activity.read +mailbox_providers.stats.read +mail_settings.address_whitelist.read +mail_settings.address_whitelist.read +mail_settings.address_whitelist.update +mail_settings.address_whitelist.update +mail_settings.bcc.read +mail_settings.bcc.update +mail_settings.bounce_purge.read +mail_settings.bounce_purge.read +mail_settings.bounce_purge.update +mail_settings.bounce_purge.update +mail_settings.footer.read +mail_settings.footer.update +mail_settings.forward_bounce.read +mail_settings.forward_bounce.read +mail_settings.forward_bounce.update +mail_settings.forward_bounce.update +mail_settings.forward_spam.read +mail_settings.forward_spam.read +mail_settings.forward_spam.update +mail_settings.forward_spam.update +mail_settings.plain_content.read +mail_settings.plain_content.read +mail_settings.plain_content.update +mail_settings.plain_content.update +mail_settings.read +mail_settings.spam_check.read +mail_settings.spam_check.read +mail_settings.spam_check.update +mail_settings.spam_check.update +mail_settings.template.read +mail_settings.template.update +marketing_campaigns.create +marketing_campaigns.delete +marketing_campaigns.read +marketing_campaigns.update +partner_settings.new_relic.read +partner_settings.new_relic.read +partner_settings.new_relic.update +partner_settings.new_relic.update +partner_settings.read +partner_settings.sendwithus.read +partner_settings.sendwithus.update +user.scheduled_sends.create +user.scheduled_sends.create +user.scheduled_sends.delete +user.scheduled_sends.delete +user.scheduled_sends.read +user.scheduled_sends.read +user.scheduled_sends.update +user.scheduled_sends.update +suppression.invalid_emails.create +suppression.invalid_emails.create +suppression.invalid_emails.read +suppression.invalid_emails.read +suppression.invalid_emails.update +suppression.invalid_emails.update +suppression.invalid_emails.delete +suppression.invalid_emails.delete +suppression.spam_reports.create +suppression.spam_reports.create +suppression.spam_reports.read +suppression.spam_reports.read +suppression.spam_reports.update +suppression.spam_reports.update +suppression.spam_reports.delete +suppression.spam_reports.delete +tracking_settings.click.read +tracking_settings.click.update +tracking_settings.google_analytics.read +tracking_settings.google_analytics.read +tracking_settings.google_analytics.update +tracking_settings.google_analytics.update +tracking_settings.open.read +tracking_settings.open.update +tracking_settings.read +tracking_settings.subscription.read +tracking_settings.subscription.update +user.account.read +user.credits.read +user.email.create +user.email.delete +user.email.read +user.email.update +user.multifactor_authentication.create +user.multifactor_authentication.create +user.multifactor_authentication.delete +user.multifactor_authentication.delete +user.multifactor_authentication.read +user.multifactor_authentication.read +user.multifactor_authentication.update +user.multifactor_authentication.update +user.password.read +user.password.update +user.profile.read +user.profile.update +user.settings.enforced_tls.read +user.settings.enforced_tls.read +user.settings.enforced_tls.update +user.settings.enforced_tls.update +user.timezone.update +access_settings.activity.read +access_settings.whitelist.create +access_settings.whitelist.delete +access_settings.whitelist.read +access_settings.whitelist.update +access_settings.activity.read +access_settings.whitelist.create +access_settings.whitelist.delete +access_settings.whitelist.read +access_settings.whitelist.update +api_keys.create +api_keys.delete +api_keys.read +api_keys.update +email_activity.read +mail_settings.address_whitelist.read +mail_settings.address_whitelist.read +mail_settings.address_whitelist.update +mail_settings.address_whitelist.update +mail_settings.bcc.read +mail_settings.bcc.update +mail_settings.bounce_purge.read +mail_settings.bounce_purge.read +mail_settings.bounce_purge.update +mail_settings.bounce_purge.update +mail_settings.footer.read +mail_settings.footer.update +mail_settings.forward_bounce.read +mail_settings.forward_bounce.read +mail_settings.forward_bounce.update +mail_settings.forward_bounce.update +mail_settings.forward_spam.read +mail_settings.forward_spam.read +mail_settings.forward_spam.update +mail_settings.forward_spam.update +mail_settings.plain_content.read +mail_settings.plain_content.read +mail_settings.plain_content.update +mail_settings.plain_content.update +mail_settings.read +mail_settings.spam_check.read +mail_settings.spam_check.read +mail_settings.spam_check.update +mail_settings.spam_check.update +mail_settings.template.read +mail_settings.template.update +mailbox_providers.stats.read +marketing_campaigns.create +marketing_campaigns.delete +marketing_campaigns.read +marketing_campaigns.update +partner_settings.new_relic.read +partner_settings.new_relic.read +partner_settings.new_relic.update +partner_settings.new_relic.update +partner_settings.read +partner_settings.sendwithus.read +partner_settings.sendwithus.update +suppression.invalid_emails.create +suppression.invalid_emails.create +suppression.invalid_emails.delete +suppression.invalid_emails.delete +suppression.invalid_emails.read +suppression.invalid_emails.read +suppression.invalid_emails.update +suppression.invalid_emails.update +suppression.spam_reports.create +suppression.spam_reports.create +suppression.spam_reports.delete +suppression.spam_reports.delete +suppression.spam_reports.read +suppression.spam_reports.read +suppression.spam_reports.update +suppression.spam_reports.update +tracking_settings.click.read +tracking_settings.click.update +tracking_settings.google_analytics.read +tracking_settings.google_analytics.read +tracking_settings.google_analytics.update +tracking_settings.google_analytics.update +tracking_settings.open.read +tracking_settings.open.update +tracking_settings.read +tracking_settings.subscription.read +tracking_settings.subscription.update +user.account.read +user.credits.read +user.email.create +user.email.delete +user.email.read +user.email.update +user.multifactor_authentication.create +user.multifactor_authentication.create +user.multifactor_authentication.delete +user.multifactor_authentication.delete +user.multifactor_authentication.read +user.multifactor_authentication.read +user.multifactor_authentication.update +user.multifactor_authentication.update +user.password.read +user.password.update +user.profile.read +user.profile.update +user.scheduled_sends.create +user.scheduled_sends.create +user.scheduled_sends.delete +user.scheduled_sends.delete +user.scheduled_sends.read +user.scheduled_sends.read +user.scheduled_sends.update +user.scheduled_sends.update +user.settings.enforced_tls.read +user.settings.enforced_tls.read +user.settings.enforced_tls.update +user.settings.enforced_tls.update +Klaviyo +Rdio +Dmitry +Shumytskyi +Clemente +Martyn +Vijay +Vaidyanathan +Branko +Vukelick +Chasanoff +Brear +Shingo +Ichikawa +godpod +Ravi +Rajendra +Jurian +Sluiman \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 836f1898df..c8b8850964 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,8 @@ script: - bundle exec jekyll build - bundle exec rake linklint - bundle exec rake validate_json_xml +after_script: +- travis_retry npm run test after_success: - sh -c "if [ '$TRAVIS_PULL_REQUEST' = false ]; then bundle exec cap deploy; fi" - sh -c "if [ '$TRAVIS_PULL_REQUEST' = false ]; then bundle exec rake invalidate_cloudfront; @@ -46,12 +48,3 @@ env: - secure: nQobA88hQIc6GW2Z1N0jqqDKmkvM4fiWjcdF2n07O8dSKsrEUmviQsy5oaRfgozbGeeXDlsPlpt1ezE4u+ChEzZwd6UbsSeUjr3RTWl6prrxYX4XmO7Hx6i7dsFLOV66av5gNyglfUTLXTEKJgg4Ckr/1GiqvAcEgCrXjvHyFtc= - secure: 6088c9CZ3gB6UL4lZ27VU16s+O0pFoeiE1GSOEZru/1GTH1Mifhb95lpu1PqkZsvVVsyy3MVDyoZcxyHWuvmUwH8RHvZzj7cuXwwbxO2kxStECx1QUUOeSZDR7GtHQrxSDWYD7wBeKgdP7Bdq6gvUYOL8S06kTNCTFApLJbT7Yc= - secure: KroLKOYGGmplD0nCxTXUB0R+tnK8bFt46yp+d2bzOWxaulKHshwXV231e2AiPHxVlSYVJRiO7pZbTuVhbH7GD1ht41TlRdzURStq4kPSDrP9ZVQwRWpkKjgIMguxPIs/46ccxbA48tBYYJyy/51Ia4isQyQ9Wl083W0mC319kv0= -notifications: - hipchat: - rooms: - secure: vVKtWAX1+24dxhJFk38dbnBimswn4Tdj0PRy5UURkhuujSGYW7PPhkyJf5jcz381AsjUxzzEPLTHy41Ve/pfIng3Y7c9OfS6a/M1qjrd4c2M+Fg9ntHr4ck2G5MsSQEg/zwKSrUXMk/RXKsdn5h4qmWr06i74Lau+SeWuS5xXiA= - template: - - 'Docs Build - %{build_number} on branch %{branch} by %{author}: %{message} - View on GitHub' - format: html diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..713d39ebf5 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,45 @@ +# SendGrid Community Code of Conduct + +The SendGrid open source community is made up of members from around the globe with a diverse set of skills, personalities, and experiences. It is through these differences that our community experiences successes and continued growth. When you're working with members of the community, we encourage you to follow these guidelines, which help steer our interactions and strive to maintain a positive, successful and growing community. + +### Be Open +Members of the community are open to collaboration, whether it's on pull requests, code reviews, approvals, issues or otherwise. We're receptive to constructive comments and criticism, as the experiences and skill sets of all members contribute to the whole of our efforts. We're accepting of all who wish to take part in our activities, fostering an environment where anyone can participate, and everyone can make a difference. + +### Be Considerate +Members of the community are considerate of their peers, which include other contributors and users of SendGrid. We're thoughtful when addressing the efforts of others, keeping in mind that often the labor was completed with the intent of the good of the community. We're attentive in our communications, whether in person or online, and we're tactful when approaching differing views. + +### Be Respectful +Members of the community are respectful. We're respectful of others, their positions, their skills, their commitments and their efforts. We're respectful of the volunteer efforts that permeate the SendGrid community. We're respectful of the processes outlined in the community, and we work within them. When we disagree, we are courteous in raising our issues. Overall, we're good to each other. We contribute to this community not because we have to, but because we want to. If we remember that, these guidelines will come naturally. + +## Additional Guidance + +### Disclose Potential Conflicts of Interest +Community discussions often involve interested parties. We expect participants to be aware when they are conflicted due to employment or other projects they are involved in and disclose those interests to other project members. When in doubt, over-disclose. Perceived conflicts of interest are important to address so that the community’s decisions are credible even when unpopular, difficult or favorable to the interests of one group over another. + +### Interpretation +This Code is not exhaustive or complete. It is not a rulebook; it serves to distill our common understanding of a collaborative, shared environment and goals. We expect it to be followed in spirit as much as in the letter. When in doubt, try to abide by [SendGrid’s cultural values](https://sendgrid.com/blog/employee-engagement-the-4h-way) defined by our “4H’s”: Happy, Hungry, Humble and Honest. + +### Enforcement +Most members of the SendGrid community always comply with this Code, not because of the existence of this Code, but because they have long experience participating in open source communities where the conduct described above is normal and expected. However, failure to observe this Code may be grounds for suspension, reporting the user for abuse or changing permissions for outside contributors. + +## If you have concerns about someone’s conduct +**Initiate Direct Contact** - It is always appropriate to email a community member (if contact information is available), mention that you think their behavior was out of line, and (if necessary) point them to this Code. + +**Discuss Publicly** - Discussing publicly is always acceptable. Note, though, that approaching the person directly may be better, as it tends to make them less defensive, and it respects the time of other community members, so you probably want to try direct contact first. + +**Contact the Moderators** - You can reach the SendGrid moderators by emailing dx@sendgrid.com. + +## Submission to SendGrid Repositories +Finally, just a reminder, changes to the SendGrid repositories will only be accepted upon completion of the [SendGrid Contributor Agreement](https://cla.sendgrid.com). + +## Attribution + +SendGrid thanks the following, on which it draws for content and inspiration: + +* [Python Community Code of Conduct](https://www.python.org/psf/codeofconduct/) +* [Open Source Initiative General Code of Conduct](https://opensource.org/codeofconduct) +* [Apache Code of Conduct](https://www.apache.org/foundation/policies/conduct.html) + + + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..7b916567a5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,467 @@ +Hello! Thank you for choosing to help contribute to one of the SendGrid open source libraries. There are many ways you can contribute and help is always welcome. We simply ask that you follow the following contribution policies. + +* [CLAs and CCLAs](#cla) +* [Feature Request](#feature-request) +* [Improvements to the Codebase](#improvements-to-the-codebase) +* [Local Setup](#install-and-run-locally) + * [Dependencies](#dependencies) + * [Setup Steps](#setup-steps) + * [Configure Jekyll](#configure-jekyll) + * [Running](#running) + * [View Your Install](#view-your-install) + * [Important Things to Know](#important) + * [Using Docker](#using-docker) +* [Config](#config) + * [The Nav Tree](#tree) + * [Pages](#pages) + * [SEO](#seo) + * [Custom Liquid Tags](#tags) + * [Anchors](#anchors) + * [Info blocks](#info_blocks) + * [API Examples](#api) +* [JS and CSS, etc](#js_and_css) +* [Node Spellchecker](#node-spellchecker) + * [Init](#spellchecker-init) + * [Usage](#spellchecker-usage) + * [Example output](#spellchecker-example) + * [Dictionary](#spellchecker-dictionary) + * [Contribution](#spellchecker-contribution) +* [Creating a Pull Request](#creating-a-pull-request) + +Feel free to grab an issue you want to work on. Please indicate that you have begun work on it to avoid collisions. Once a PR is made, community review, comments, suggestions and additional PRs are welcomed and encouraged. + +**Submit all pull requests to the develop branch.** + + +## CLAs and CCLAs + +Before you get started, SendGrid requires that a SendGrid Contributor License Agreement (CLA) be filled out by every contributor to a SendGrid open source project. + +Our goal with the CLA is to clarify the rights of our contributors and reduce other risks arising from inappropriate contributions. The CLA also clarifies the rights SendGrid holds in each contribution and helps to avoid misunderstandings over what rights each contributor is required to grant to SendGrid when making a contribution. In this way the CLA encourages broad participation by our open source community and helps us build strong open source projects, free from any individual contributor withholding or revoking rights to any contribution. + +SendGrid does not merge a pull request made against a SendGrid open source project until that pull request is associated with a signed CLA. Copies of the CLA are available [here](https://gist.github.com/SendGridDX/98b42c0a5d500058357b80278fde3be8#file-sendgrid_cla). + +When you create a Pull Request, after a few seconds, a comment will appear with a link to the CLA. Click the link and fill out the brief form and then click the "I agree" button and you are all set. You will not be asked to re-sign the CLA unless we make a change. + +**Before your pull request can be merged into the develop branch, you must submit a completed CLA.** + + +There are a few ways to contribute, which we'll enumerate below: + + +## Feature Request + +If you'd like to make a feature request, please read this section. + +The GitHub issue tracker is the preferred channel for library feature requests, but please respect the following restrictions: + +- Please **search for existing issues** in order to ensure we don't have duplicate bugs/feature requests. +- Please be respectful and considerate of others when commenting on issues + + +## Improvements to the Codebase + +We welcome direct contributions to the sendgrid docs code base. Thank you! + + + +## Local Setup + + +### Dependencies + +* Required: + * Git + * Xcode + * Java + * Rvm + * Yaml + * Homebrew + * npm + * git-flow + * bundler gem + * bower + + +### Setup Steps + +* Install Git for: + * [Mac](https://git-scm.com/download/mac) + * [Windows](https://git-scm.com/download/win) + * [Linux](https://git-scm.com/download/linux) +* Install a GitGUI (if you want it) for: + * [Mac](https://mac.github.com) + * [Windows](https://desktop.github.com/) + * [Linux](https://git-scm.com/download/gui/linux) +* Install [Xcode](https://developer.apple.com/xcode/) (if you don't have it installed. Click the link to download) +* Install Xcode command line tools > Xcode > Preferences > Downloads (These are bundled in Xcode as of OSX 10.9) + * Note: You may need to run `$ xcode-select --install` +* Install JDK +The yui compressor will need the full JDK to run - [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) +* Install RVM + + `$ \curl -L [https://get.rvm.io](https://get.rvm.io/) | bash -s stable --ruby` + +* Close and reopen your terminal window +* Check which version of Ruby you have + + `$ ruby -v` + +The very latest stable version (2.4.0) isn't compatible with the gems we use for the build, so you'll probably need to download version 2.3.0. + + $ rvm install 2.3.0 + +then set that version to be the default version + + $ rvm --default use 2.3.0 + +* Install Homebrew (if you don't have it) + + `$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` + +* Install YAML + + `$ brew install libyaml` + +* Install npm + + `$ brew install npm` + +* Set your Node version + + `$ npm install -g n` + + `$ n 6.10.1` + +* install git flow to manage branches ([http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/](http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/)) (optional) + + `$ brew install git-flow` + +* clone repo + + `$ git clone https://github.com/sendgrid/docs.git` + +OR use the GitGUI tool to clone the repo + + +* switch to develop branch to make changes + + `$ ls docs` + + `$ git checkout develop` + +* install bundle (if you don't have this installed) + + `$ sudo gem install bundler` + +* Go to your docs directory + + `$ cd docs` + +* Install the build tools + + `$ npm install` + +to install build tools. + +* Install bower + + `$ npm install -g bower` + +* Install client-side dependencies (jQuery, bootstrap) + + `$ bower install` + +to install client-side dependencies. + +* Install required Ruby gems + + `$ bundle install` + + * If the gem installation fails with a message like "An error occurred while installing libv8 (3.16.14.7), and Bundler cannot continue", a few extra steps will be necessary in order to build and install a version of V8 that can be used by the libv8 and therubyracer gems: + + `$ gem uninstall libv8` + + `$ brew tap homebrew/versions` + + `$ brew install --force v8-315` + + `$ bundle config build.libv8 "--with-system-v8 --with-v8-dir=$(brew --prefix v8-315)"` + + `$ sudo gem install therubyracer -v '0.12.2'` + + `$ bundle config build.therubyracer "--with-v8-dir=$(brew --prefix v8-315)"` + + `$ bundle install` + + +### Configure Jekyll + +* Copy, DO NOT DELETE the _config.sample.yml file - definitely do not commit a delete of this file ! + + `$ cp _config.sample.yml _config.yml` + +* Edit the following items in the _config.yml "Jekyll & Plugins" section to match your local environment: + + `source: /path_to_your_files/source_` +(if you're running locally path_to_your_files will be `/)_` + + `destination: /path_to_your_files/public` + +For example: + +`The source would be: /Users/USERNAME/docs/source` + +`The destination would be: /Users/USERNAME/docs/public` + + +### Running + +* Do the following instead of Jekyll serve: + + `$ bundle exec rake preview` + +Note: if you receive an error message similar to "No Java Runtime Present: Requesting Install" please see the following instructions + +* Open your Terminal or Cmd +* If `java -version` gives you an error and a popup +* Get the download here + * [Mac](https://www.java.com/en/download/faq/java_mac.xml) + * [Windows](https://www.java.com/en/download/) +* Install it +* In your terminal, type: + + `$ export JAVA_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"` + +* Run `java -version` again. + +If that worked, then add the above command to your .bash_profile or .profile file and then run 'source .profile' +[http://stackoverflow.com/a/19582689](http://stackoverflow.com/a/19582689) + + +### View Your Install +* Browse to [http://localhost:4000](http://localhost:4000) + + +### Important Things to Know + +* The source files are in `/source`, and the generated files will be created in `/public`. They get overwritten or wiped out when the site is rebuilt. + +* To rebuild the site, `ctrl-c` to cancel the build, and then [bundle exec rake preview] to restart it. + + +### Using Docker + +Install [Docker](https://www.docker.com/) first, then in terminal execute: + +``` +$ docker build -t sendgrid/docs:latest . +$ docker run --rm -it -p 4000:4000 sendgrid/docs:latest +``` + +Wait until you see `Server running... press ctrl-c to stop.` and browse to [http://localhost:4000](http://localhost:4000) + + +## Config + +The config is defined in `_config.yml`. + +The only config variables you should need to know about are root, which is the root from which all links are calculated, and the folder_weights hash, which specifies the order that the folders should be displayed in the nav tree. Higher weights mean higher display priority (higher in the tree). You can also specify icons for folders with the +folder_icons hash. + +There's also a version number in the config. + + +### The Nav Tree + +The nav tree is generated by the plugin `site_navigation.rb`. It is essentially a recursive traversal of all the folders and pages in the Source folder that generates a hierarchical tree, sorted by folder weight and page weight. + +Breadcrumbs are generated by the `breadcrumbs.rb` plugin. + + +### Pages + +You can write pages in markdown, HTML, or HAML. They all get converted to HTML when the site is generated. + +Pages have a block of YAML at the top that sets a few options. They are pretty self-explanatory; here's an example + +``` +--- +layout: page +weight: 0 +title: Docs Home +icon: icon-home +showTitle: false +navigation: + show: true +--- +``` + +Weights are same as the folder weights - the higher numbers move higher up the tree. Icons are based on the CSS icon class names from Twitter Bootstrap. showTitle and navigation["show"] both default to true if not specified. + + +#### SEO +Various fields pertinent to SEO can be controlled through the YAML front matter. Here's an example: + +``` +--- +seo: + title: Really Great Documentation - SendGrid Documentation | SendGrid + override: true + description: This is some really great documentation! I hope you like it! + canonical: http://sendgrid.com/docs/really-great-docs +--- +``` + +By default `` tags follow the template `{Page Title} {Site Title}`. However the page title can be changed for the purpose of the tag by using `seo["title"]`. `seo["override"]` will override the entire template, instead making the title page `{seo["title"]}`. `description` and `canonical` change their respective tags. + +<a name="tags"></a> +### Custom Liquid Tags +There are some custom plugins (look in the `plugins` folder) that define new liquid blocks for use in pages. + +<a name="anchors"></a> +#### Anchors + +You can create anchor tags that will have named anchors generated for them automatically with links on hover. +The parameter is the wrapping element to use. + +``` +{% anchor h2 %} +Some Anchor Text +{% endanchor %} +``` +<a name="info_blocks"></a> +#### Info blocks + +Similarly you can create info and warning blocks: + +``` +{% info %} +Some info for a breakout block. +{% endinfo %} + +{% warning %} +...And a warning breakout. +{% endwarning %} +``` + +<a name="api"></a> +#### API Examples + +If you are working on API reference docs, you can generate XML and JSON nav tabs and the corresponding example calls and responses like so: + +``` +{% apiexample identifier GET http://some.endpoint.url var1=stuff&var2=junk %} + {% response json %} +{ "foo": "bar" } + {% endresponse %} + + {% response xml %} +<foo>bar</foo> + {% endresponse %} +{% endapiexample %} +``` + +The parameters for the `apiexample` block are: unique identifier, HTTP +method, the url (excluding .json or .xml extension), and the data +payload in querystring format. + +<a name="js_and_css"></a> +## JS and CSS, etc + +JavaScript and CSS are minified and combined. The files to be packaged and their orders are specified in `_includes/head.html` and <code>CssMinify.yml</code>. Preprocessing and options can be specified +via `_plugins/jekyll_asset_pipeline.rb`. + +<a name="node-spellchecker"></a> +## Node Spellchecker + +This is a spellchecker functionality using [node-markdown-spellcheck](https://www.npmjs.com/package/markdown-spellcheck) node package. + +<a name="spellchecker-init"></a> +### Init +``` +# (pull code updates before this) +# install updated npm package dependencies! +$ npm install +``` +<a name="spellchecker-usage"></a> +### Usage +``` +# generates report of misspellings +$ npm run spellcheck + +# generates report of misspellings of [filename] +$ npm run spellcheck-file [filename] +``` +<a name="spellchecker-example"></a> +#### Example output: +![Spellcheck Output](./source/images/spellcheck-output.png?raw=true "Spellcheck Output") + +<a name="spellchecker-dictionary"></a> +### Dictionary: English-US + +See [http://wordlist.aspell.net/dicts/](http://wordlist.aspell.net/dicts/). +Also `.spelling` contains a list of custom words added to the dictionary. + +<a name="spellchecker-contribution"></a> +### Contribution +This still needs work! Many, many words in tech jargon come back as incorrect. +The best way I've found to solve this issue without too much overhead work: +1. Run `$ npm run spellcheck` +2. Edit `.spelling` to include the words that are coming back incorrect but are correct! + +<a name="creating-a-pull-request"></a> +## Creating a Pull Request + +1. [Fork](https://help.github.com/fork-a-repo/) the project, clone your fork, + and configure the remotes: + + ```bash + # Clone your fork of the repo into the current directory + $ git clone https://github.com/sendgrid/docs + # Navigate to the newly cloned directory + $ cd docs + # Assign the original repo to a remote called "upstream" + $ git remote add upstream https://github.com/sendgrid/docs + ``` + +2. If you cloned a while ago, get the latest changes from upstream: + + ```bash + $ git checkout <dev-branch> + $ git pull upstream <dev-branch> + ``` + +3. Create a new topic branch (off the main project development branch) to + contain your feature, change, or fix: + + ```bash + $ git checkout -b <topic-branch-name> + ``` + +4. Commit your changes in logical chunks. Please adhere to these [git commit + message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) + or your code is unlikely to be merged into the main project. Use Git's + [interactive rebase](https://help.github.com/articles/interactive-rebase) + feature to tidy up your commits before making them public. + +4a. Create tests. + +4b. Create or update the example code that demonstrates the functionality of this change to the code. + +5. Locally merge (or rebase) the upstream development branch into your topic branch: + + ```bash + $ git pull [--rebase] upstream master + ``` + +6. Push your topic branch up to your fork: + + ```bash + $ git push origin <topic-branch-name> + ``` + +7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) + with a clear title and description against the `master` branch. All tests must be passing before we will review the PR. + +If you have any additional questions, please feel free to [email](mailto:dx@sendgrid.com) us or create an issue in this repo. diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..f471ca0c31 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +FROM ruby:2.3.5 + +WORKDIR /docs +SHELL ["/bin/bash", "-lc"] + +# Java +RUN apt-get update -qq && \ + apt-get install -y -qq openjdk-7-jdk && \ + rm -rf /var/lib/apt/lists/* +ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64 + +# Node.js +RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash +COPY .nvmrc /docs +RUN nvm install $(cat .nvmrc) + +COPY package.json package-lock.json /docs/ +RUN npm install -g bower && \ + npm install +COPY bower.json .bowerrc /docs/ +RUN bower install --allow-root +COPY Gemfile Gemfile.lock /docs/ +RUN bundle install -j 4 + +COPY . /docs + +COPY _config.sample.yml _config.yml + +ONBUILD VOLUME ["node_modules/"] +ONBUILD VOLUME ["gems/"] +VOLUME ["/source/"] +VOLUME ["/public/"] + +EXPOSE 4000 + +CMD ["/bin/bash", "-lc", "bundle exec rake preview"] diff --git a/Gemfile b/Gemfile index d45d17bef1..2a17d62e8b 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source "http://rubygems.org" gem 'rake', '>=10.4.2' gem 'rack' gem 'htmlentities' -gem 'jekyll', '2.0.3' +gem 'jekyll', '2.2.0' gem 'jekyll-watch', '1.2.1' gem 'rubypants' gem 'rdiscount' diff --git a/Gemfile.lock b/Gemfile.lock index 7ba877f2e9..7c174adb84 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,8 @@ GEM remote: http://rubygems.org/ specs: + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) aws-sdk (1.40.0) json (~> 1.4) nokogiri (>= 1.4.4) @@ -18,21 +20,21 @@ GEM coffee-script (2.4.1) coffee-script-source execjs - coffee-script-source (1.10.0) + coffee-script-source (1.11.1) colorator (0.1) colored (1.2) commonjs (0.2.7) - execjs (2.6.0) - faraday (0.9.2) + execjs (2.7.0) + faraday (0.13.1) multipart-post (>= 1.2, < 3) - faraday_middleware (0.10.0) - faraday (>= 0.7.4, < 0.10) + faraday_middleware (0.12.2) + faraday (>= 0.7.4, < 1.0) fast-stemmer (1.0.2) - ffi (1.9.10) + ffi (1.9.18) haml (4.0.7) tilt highline (1.7.8) - hitimes (1.2.3) + hitimes (1.2.6) htmlentities (4.3.4) indextank (1.0.13) faraday_middleware (>= 0.9.0) @@ -40,37 +42,43 @@ GEM japr (0.3.2) jekyll (~> 2.0) liquid (~> 2.4) - jekyll (2.0.3) + jekyll (2.2.0) classifier (~> 1.3) colorator (~> 0.1) jekyll-coffeescript (~> 1.0) + jekyll-gist (~> 1.0) + jekyll-paginate (~> 1.0) jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.0) kramdown (~> 1.3) - liquid (~> 2.5.5) - listen (~> 2.5) + liquid (~> 2.6.1) mercenary (~> 0.3.3) - pygments.rb (~> 0.5.0) + pygments.rb (~> 0.6.0) redcarpet (~> 3.1) safe_yaml (~> 1.0) toml (~> 0.1.0) - jekyll-coffeescript (1.0.1) + jekyll-coffeescript (1.0.2) coffee-script (~> 2.2) - jekyll-sass-converter (1.3.0) - sass (~> 3.2) + coffee-script-source (~> 1.11.1) + jekyll-gist (1.4.1) + octokit (~> 4.2) + jekyll-paginate (1.1.0) + jekyll-sass-converter (1.5.0) + sass (~> 3.4) jekyll-watch (1.2.1) listen (~> 2.7) jmespath (1.1.3) json (1.8.3) - kramdown (1.9.0) + kramdown (1.15.0) less (2.6.0) commonjs (~> 0.2.7) libv8 (3.16.14.13) - liquid (2.5.5) + liquid (2.6.3) listen (2.10.1) celluloid (~> 0.16.0) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) - mercenary (0.3.5) + mercenary (0.3.6) mime-types (3.0) mime-types-data (~> 3.2015) mime-types-data (3.2015.1120) @@ -88,19 +96,22 @@ GEM mini_portile (~> 0.6.0) nokogiri-pretty (0.1.0) nokogiri + octokit (4.7.0) + sawyer (~> 0.8.0, >= 0.5.3) parslet (1.5.0) blankslate (~> 2.0) - posix-spawn (0.3.11) - pygments.rb (0.5.4) + posix-spawn (0.3.13) + public_suffix (3.0.1) + pygments.rb (0.6.3) posix-spawn (~> 0.3.6) - yajl-ruby (~> 1.1.0) + yajl-ruby (~> 1.2.0) rack (1.6.4) rake (10.4.2) - rb-fsevent (0.9.6) - rb-inotify (0.9.5) - ffi (>= 0.5.0) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) rdiscount (2.1.8) - redcarpet (3.3.3) + redcarpet (3.4.0) ref (2.0.0) rubypants (0.2.0) s3-static-site (0.3.0) @@ -109,7 +120,14 @@ GEM haml mime-types safe_yaml (1.0.4) - sass (3.4.19) + sass (3.5.3) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.8.1) + addressable (>= 2.3.5, < 2.6) + faraday (~> 0.8, < 1.0) simple-cloudfront-invalidator (1.0.1) colored (= 1.2) therubyracer (0.12.2) @@ -120,7 +138,7 @@ GEM hitimes toml (0.1.2) parslet (~> 1.5.0) - yajl-ruby (1.1.0) + yajl-ruby (1.2.2) yui-compressor (0.12.0) PLATFORMS @@ -134,7 +152,7 @@ DEPENDENCIES htmlentities indextank japr (>= 0.3) - jekyll (= 2.0.3) + jekyll (= 2.2.0) jekyll-watch (= 1.2.1) jmespath (= 1.1.3) less @@ -151,4 +169,4 @@ DEPENDENCIES yui-compressor BUNDLED WITH - 1.10.6 + 1.16.0 diff --git a/README.markdown b/README.markdown index 782e62eb12..1b5365140e 100644 --- a/README.markdown +++ b/README.markdown @@ -1,77 +1,268 @@ +![SendGrid Logo](https://uiux.s3.amazonaws.com/2016-logos/email-logo%402x.png) + # SendGrid Documentation [![Build Status](https://travis-ci.org/sendgrid/docs.svg?branch=develop)](https://travis-ci.org/sendgrid/docs) -[![Dependency Status](https://gemnasium.com/sendgrid/docs.svg)](https://gemnasium.com/sendgrid/docs) +[![Twitter Follow](https://img.shields.io/twitter/follow/sendgrid.svg?style=social&label=Follow)](https://twitter.com/sendgrid) +[![GitHub contributors](https://img.shields.io/github/contributors/sendgrid/docs.svg)](https://github.com/sendgrid/docs/graphs/contributors) +[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./license) +[![Open Source Helpers](https://www.codetriage.com/sendgrid/docs/badges/users.svg)](https://www.codetriage.com/sendgrid/docs) -This site is based on Octopress, which is in turn based on Jekyll, with a dash of Twitter Bootstrap added. +This site is based on Octopress, which in turn is based on Jekyll, with a dash of Twitter Bootstrap added. The develop branch is continuously deployed to a preview site. [View dev site](http://d2w67tjf43xwdp.cloudfront.net/) +The develop branch is merged to production weekly (unless we need to do a release sooner than that). + The master branch is continuously deployed to production. -_Please_, feel free to make any contributions you feel will make SendGrid Documentation better. +### _Please_, feel free to make any contributions you feel will make SendGrid Documentation better. **Submit all pull requests to the develop branch** **Before your pull request can be merged into the develop branch, you must submit a completed CLA.** + +## Table of Contents + +* [CLAs and CCLAs](#cla) +* [Local Setup](#local) + * [Dependencies](#dependencies) + * [Setup Steps](#setup) + * [Configure jekyll](#jekyll) + * [Running](#running) + * [View your install](#view) + * [Important Things to Know](#important) + * [Using Docker](#using-docker) +* [Config](#config) + * [The Nav Tree](#tree) + * [Pages](#pages) + * [SEO](#seo) + * [Custom Liquid Tags](#tags) + * [Anchors](#anchors) + * [Info blocks](#info_blocks) + * [API Examples](#api) +* [JS and CSS, etc](#js_and_css) +* [Node Spellchecker](#node-spellchecker) + * [Init](#spellchecker-init) + * [Usage](#spellchecker-usage) + * [Example output](#spellchecker-example) + * [Dictionary](#spellchecker-dictionary) + * [Contribution](#spellchecker-contribution) +* [Style Guide](#style-guide) +* [About](#about) + +* [License](#license) + +<a name="cla"></a> ## CLAs and CCLAs -Before you get started, SendGrid requires that a SendGrid Contributor License Agreement (CLA) or a SendGrid Company Contributor Licensing Agreement (CCLA) be filled out by every contributor to a SendGrid open source project. +Before you get started, SendGrid requires that a SendGrid Contributor License Agreement (CLA) be filled out by every contributor to a SendGrid open source project. -Our goal with the CLA and CCLA is to clarify the rights of our contributors and reduce other risks arising from inappropriate contributions. The CLA also clarifies the rights SendGrid holds in each contribution and helps to avoid misunderstandings over what rights each contributor is required to grant to SendGrid when making a contribution. In this way the CLA and CCLA encourage broad participation by our open source community and help us build strong open source projects, free from any individual contributor withholding or revoking rights to any contribution. +Our goal with the CLA is to clarify the rights of our contributors and reduce other risks arising from inappropriate contributions. The CLA also clarifies the rights SendGrid holds in each contribution and helps to avoid misunderstandings over what rights each contributor is required to grant to SendGrid when contributing. In this way, the CLA encourages broad participation by our open source community and helps us build strong open source projects, free from any individual contributor withholding or revoking rights to any contribution. -SendGrid does not merge a pull request made against a SendGrid open source project until that pull request is associated with a signed CLA (or CCLA). Copies of the CLA and CCLA are available [here](https://drive.google.com/a/sendgrid.com/file/d/0B0PlcM9qA91LN2VEUTJWU2RIVXc/view). -You may submit your completed [CLA or CCLA](https://drive.google.com/a/sendgrid.com/file/d/0B0PlcM9qA91LN2VEUTJWU2RIVXc/view) to SendGrid at [dx@sendgrid.com](mailto:dx@sendgrid.com). SendGrid will then confirm you are ready to begin making contributions. +SendGrid does not merge a pull request made against a SendGrid open source project until that pull request is associated with a signed CLA. Copies of the CLA are available [here](https://gist.github.com/SendGridDX/98b42c0a5d500058357b80278fde3be8#file-sendgrid_cla). +<a name="local"></a> ## Local Setup -* Clone the repo. -* `npm install` to install build tools. -* `bower install` to install client-side dependencies (jQuery, - bootstrap) -* `bundle install` to install required rubygems. -* Copy `_config.sample.yml` and name it `_config.yml` -* Set your root (if you're running locally it'll just be `/`) in `_config.yml` -* `bundle exec rake preview` -* Browse to `localhost:4000` +<a name="dependencies"></a> +### Dependencies -### Important Things to Know +* Required: + * Git + * Xcode + * Java + * Rvm + * Yaml + * Homebrew + * npm + * git-flow + * bundler gem + * bower -* The source files are in `/source`, and the generated files will be created in `/public`. They get overwritten or wiped out when the site is rebuilt. +<a name="setup"></a> +### Setup Steps -* To rebuild the site: <code>rake generate</code> +* Install Git for: + * [Mac](https://git-scm.com/download/mac) + * [Windows](https://git-scm.com/download/win) + * [Linux](https://git-scm.com/download/linux) +* Install a GitGUI (if you want it) for: + * [Mac](https://mac.github.com) + * [Windows](https://desktop.github.com/) + * [Linux](https://git-scm.com/download/gui/linux) +* Install [Xcode](https://developer.apple.com/xcode/) (if you don't have it installed. Click the link to download) +* Install Xcode command line tools > Xcode > Preferences > Downloads (These are bundled in Xcode as of OSX 10.9) + * Note: You may need to run `$ xcode-select --install` +* Install JDK +The yui compressor will need the full JDK to run - [http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) +* Install RVM -### Config your local + `$ \curl -sSL https://get.rvm.io | bash -s stable --ruby` -The config is defined in `_config.yml`. +* Close and reopen your terminal window +* Check your Ruby version: -The only config variables you should need to know about are <code>root</code>, which is the root from which all links are calculated, and the <code>folder_weights</code> hash, which specifies the order that the folders should be displayed in the nav tree. Higher weights mean higher display priority (higher in the tree). You can also specify icons for folders with the -<code>folder_icons</code> hash. + `$ ruby -v` -There's also a <code>version</code> number in the config. +The latest stable version (2.4.0) isn't compatible with the gems we use for the build, so you'll probably need to download version 2.3.0. -## Vagrant Setup + $ rvm install 2.3.0 -* Clone the repo. -* Bring up development environment with Vagrant +then set that version to be the default version - $ vagrant up + $ rvm --default use 2.3.0 -* Browse to [http://localhost:4000](http://localhost:4000) +* Install Homebrew (if you don't have it) + + `$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` + +* Install YAML + + `$ brew install libyaml` + +* Install npm + + `$ brew install npm` + +* Set your Node version + + `$ npm install -g n` + + `$ n 6.10.1` + +* install git flow to manage branches ([http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/](http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/)) (optional) + + `$ brew install git-flow` + +* clone repo + + `$ git clone https://github.com/sendgrid/docs.git` + +OR use the GitGUI tool to clone the repo + + +* switch to develop branch to make changes + + `$ ls docs` + + `$ git checkout develop` + +* install bundle (if you don't have this installed) + + `$ sudo gem install bundler` + +* Go to your docs directory + + `$ cd docs` + +* Install the build tools + + `$ npm install` + +to install build tools. + +* Install bower + + `$ npm install -g bower` + +* Install client-side dependencies (jQuery, bootstrap) + + `$ bower install` + +to install client-side dependencies. + +* Install required Ruby gems + + `$ bundle install` + + * If the gem installation fails with a message like "An error occurred while installing libv8 (3.16.14.7), and Bundler cannot continue", a few extra steps will be necessary in order to build and install a version of V8 that can be used by the libv8 and therubyracer gems: + + `$ gem uninstall libv8` + + `$ brew tap homebrew/versions` + + `$ brew install --force v8-315` + + `$ bundle config build.libv8 "--with-system-v8 --with-v8-dir=$(brew --prefix v8-315)"` + + `$ sudo gem install therubyracer -v '0.12.2'` + + `$ bundle config build.therubyracer "--with-v8-dir=$(brew --prefix v8-315)"` + + `$ bundle install` -## Testing +<a name="jekyll"></a> +### Configure jekyll - $ vagrant ssh - $ cd docs && bin/test +* Copy, DO NOT DELETE the _config.sample.yml file - definitely do not commit a delete of this file! -## Important Things to Know + `$ cp _config.sample.yml _config.yml` + +* Edit the following items in the _config.yml "Jekyll & Plugins" section to match your local environment: + + `source: /path_to_your_files/source_` +(if you're running locally path_to_your_files will be `/)_` + + `destination: /path_to_your_files/public` + +For example: + +`The source would be: /Users/USERNAME/docs/source` + +`The destination would be: /Users/USERNAME/docs/public` + +<a name="running"></a> +### Running + +* Do the following instead of Jekyll serve: + + `$ bundle exec rake preview` + +Note: if you receive an error message similar to "No Java Runtime Present: Requesting Install" please see the following instructions + +* Open your Terminal or Cmd +* If `java -version` gives you an error and a popup +* Get the download here + * [Mac](https://www.java.com/en/download/faq/java_mac.xml) + * [Windows](https://www.java.com/en/download/) +* Install it +* In your terminal, type: + + `export JAVA_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"` + +* Run `java -version` again. + +If that worked, then add the above command to your .bash_profile or .profile file and then run 'source .profile' +[http://stackoverflow.com/a/19582689](http://stackoverflow.com/a/19582689) + +<a name="view"></a> +### View your install +* Browse to [http://localhost:4000](http://localhost:4000) + + +<a name="important"></a> +### Important Things to Know * The source files are in `/source`, and the generated files will be created in `/public`. They get overwritten or wiped out when the site is rebuilt. -* To rebuild the site: <code>rake generate</code> +* To rebuild the site, [control][c] to cancel the build, and then [bundle exec rake preview] to restart it. + +<a name="using-docker"></a> +### Using Docker +[Install Docker](https://docs.docker.com/engine/installation/) first, then in terminal execute: + +``` +docker build -t sendgrid/docs:latest . +docker run --rm -it -p 4000:4000 sendgrid/docs:latest +``` + +Wait until you see `Server running... press ctrl-c to stop.` and browse to [http://localhost:4000](http://localhost:4000) + +<a name="config"></a> ## Config The config is defined in `_config.yml`. @@ -81,17 +272,19 @@ The only config variables you should need to know about are <code>root</code>, w There's also a <code>version</code> number in the config. +<a name="tree"></a> ### The Nav Tree The nav tree is generated by the plugin `site_navigation.rb`. It is essentially a recursive traversal of all the folders and pages in the Source folder that generates a hierarchical tree, sorted by folder weight and page weight. Breadcrumbs are generated by the `breadcrumbs.rb` plugin. +<a name="pages"></a> ### Pages You can write pages in markdown, HTML, or HAML. They all get converted to HTML when the site is generated. -Pages have a block of YAML at the top that sets a few options. They are pretty self explanatory; here's an example +Pages have a block of YAML at the top that sets a few options. They are pretty self-explanatory; here's an example: ``` --- @@ -107,8 +300,9 @@ navigation: Weights are same as the folder weights - the higher numbers move higher up the tree. Icons are based on the CSS icon class names from Twitter Bootstrap. showTitle and navigation["show"] both default to true if not specified. +<a name="seo"></a> #### SEO -Various fields pertinent to SEO can be controlled through the YAML frontmatter. Here's an example: +Various fields pertinent to SEO can be controlled through the YAML front matter. Here's an example: ``` --- @@ -120,11 +314,13 @@ seo: --- ``` -By default `<title>` tags follow the template `{Page Title} {Site Title}`. However the page title can be changed for the purpose of the tag by using `seo["title"]`. `seo["override"]` will override the entire template, instead making the title tage `{seo["title"]}`. `description` and `canonical` change their respective tags. +By default `<title>` tags follow the template `{Page Title} {Site Title}`. However, the page title can be changed for the purpose of the tag by using `seo["title"]`. `seo["override"]` will override the entire template, instead making the title page `{seo["title"]}`. `description` and `canonical` change their respective tags. +<a name="tags"></a> ### Custom Liquid Tags There are some custom plugins (look in the `plugins` folder) that define new liquid blocks for use in pages. +<a name="anchors"></a> #### Anchors You can create anchor tags that will have named anchors generated for them automatically with links on hover. @@ -135,9 +331,10 @@ The parameter is the wrapping element to use. Some Anchor Text {% endanchor %} ``` +<a name="info_blocks"></a> #### Info blocks -Similarly you can create info and warning blocks: +Similarly, you can create info and warning blocks: ``` {% info %} @@ -149,6 +346,7 @@ Some info for a breakout block. {% endwarning %} ``` +<a name="api"></a> #### API Examples If you are working on API reference docs, you can generate XML and JSON nav tabs and the corresponding example calls and responses like so: @@ -166,10 +364,67 @@ If you are working on API reference docs, you can generate XML and JSON nav tabs ``` The parameters for the `apiexample` block are: unique identifier, HTTP -method, the url (excluding .json or .xml extension), and the data -payload in querystring format. +method, the URL (excluding .json or .xml extension), and the data +the payload in query string format. +<a name="js_and_css"></a> ## JS and CSS, etc JavaScript and CSS are minified and combined. The files to be packaged and their orders are specified in `_includes/head.html` and <code>CssMinify.yml</code>. Preprocessing and options can be specified via `_plugins/jekyll_asset_pipeline.rb`. + +<a name="node-spellchecker"></a> +## Node Spellchecker + +This is a spellchecker functionality using [node-markdown-spellcheck](https://www.npmjs.com/package/markdown-spellcheck) node package. + +<a name="spellchecker-init"></a> +### Init +``` +# (pull code updates before this) +# install updated npm package dependencies! +$ npm install +``` +<a name="spellchecker-usage"></a> +### Usage +``` +# generates report of misspellings +$ npm run spellcheck + +# generates report of misspellings of [filename] +$ npm run spellcheck-file [filename] +``` +<a name="spellchecker-example"></a> +#### Example output: +![Spellcheck Output](./source/images/spellcheck-output.png?raw=true "Spellcheck Output") + +<a name="spellchecker-dictionary"></a> +### Dictionary: English-US + +See [http://wordlist.aspell.net/dicts/](http://wordlist.aspell.net/dicts/). +Also `.spelling` contains a list of custom words added to the dictionary. + +<a name="spellchecker-contribution"></a> +### Contribution +This still needs work! Many words in tech jargon come back as incorrect. +The best way I've found to solve this issue without too much overhead work: +1. Run `$ npm run spellcheck` +2. Edit `.spelling` to include the words that are coming back incorrect but are correct! + + +<a name="style-guide"></a> +## Style Guide + +The SendGrid contributor style guide can be found [here](https://github.com/sendgrid/docs/blob/master/styleguide.md). + + +<a name="about"></a> +## About + +SendGrid is guided and supported by the SendGrid [Developer Experience Team](mailto:dx@sendgrid.com). +It is maintained and funded by SendGrid, Inc. The names and logos are trademarks of SendGrid, Inc. + + +<a name="license"></a> +## License +[The MIT License (MIT)](https://github.com/sendgrid/docs/blob/develop/license) diff --git a/USAGE.md b/USAGE.md new file mode 100644 index 0000000000..b587904470 --- /dev/null +++ b/USAGE.md @@ -0,0 +1,80 @@ +This documentation is based on our [Docs](https://github.com/sendgrid/docs/tree/develop/source). + +* [Local Setup](#local) + * [Configure jekyll](#jekyll) + * [Running](#running) + * [View your install](#view) + * [Using Docker](#using-docker) + +###Local setup +<a name="jekyll"></a> +### Configure jekyll + +* Copy, DO NOT DELETE the _config.sample.yml file - definitely do not commit a delete of this file ! + + `$ cp _config.sample.yml _config.yml` + +* Edit the following items in the _config.yml "Jekyll & Plugins" section to match your local environment: + + `source: /path_to_your_files/source_` +(if you're running locally path_to_your_files will be `/)_` + + `destination: /path_to_your_files/public` + +For example: + +`The source would be: /Users/USERNAME/docs/source` + +`The destination would be: /Users/USERNAME/docs/public` + +<a name="running"></a> +### Running + +* Do the following instead of Jekyll serve: + + `$ bundle exec rake preview` + +Note: if you receive an error message similar to "No Java Runtime Present: Requesting Install" please see the following instructions + +* Open your Terminal or Cmd +* If `java -version` gives you an error and a popup +* Get the download here + * [Mac](https://www.java.com/en/download/faq/java_mac.xml) + * [Windows](https://www.java.com/en/download/) +* Install it +* In your terminal, type: + + `export JAVA_HOME="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home"` + +* Run `java -version` again. + +If that worked, then add the above command to your .bash_profile or .profile file and then run 'source .profile' +[http://stackoverflow.com/a/19582689](http://stackoverflow.com/a/19582689) + +<a name="view"></a> +### View your install +* Browse to [http://localhost:4000](http://localhost:4000) + +### Using Docker + +Install [Docker](https://www.docker.com/) first, then in terminal execute: + +``` +docker build -t sendgrid/docs:latest . +docker run --rm -it -p 4000:4000 sendgrid/docs:latest +``` + +Wait until you see `Server running... press ctrl-c to stop.` and browse to [http://localhost:4000](http://localhost:4000) + +### Run linklinkt and jsonlink + +``` + bundle exec rake linklint + bundle exec rake validate_json_xml +``` + +### Run spell check + +`` +npm run spellcheck +``` diff --git a/Vagrantfile b/Vagrantfile index 4d0bb0054b..7bffc649ae 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -11,8 +11,8 @@ Vagrant.configure("2") do |config| config.vm.define 'ubuntu', primary: true do |c| c.vm.network "private_network", ip: "192.168.100.2" c.vm.network "forwarded_port", guest: 4000, host: 4000 - c.vm.box = "utopic-server-cloudimg-amd64-vagrant-disk1.box" - c.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/utopic/current/utopic-server-cloudimg-amd64-vagrant-disk1.box" + c.vm.box = "hashicorp/precise64" + c.vm.box_url = "http://files.vagrantup.com/precise64.box" c.vm.provision "shell" do |s| s.inline = "apt-get update -y; apt-get install git ruby ruby-dev gems node nodejs npm openjdk-8-jre -y; gem install bundler; cd #{app_path} && npm install && bin/install && bin/preview" diff --git a/bin/build b/bin/build index 3174a95188..d19ac6ffcc 100755 --- a/bin/build +++ b/bin/build @@ -1,3 +1,3 @@ #!/bin/sh -bundle exec jekyll build \ No newline at end of file +bundle exec jekyll build diff --git a/bin/install b/bin/install index 5db40b0043..15418372ea 100755 --- a/bin/install +++ b/bin/install @@ -2,4 +2,4 @@ npm install bower install -bundle install \ No newline at end of file +bundle install diff --git a/bin/preview b/bin/preview index 8108d7e5ea..52e925ad34 100755 --- a/bin/preview +++ b/bin/preview @@ -1,3 +1,3 @@ #!/bin/sh -bundle exec jekyll serve --watch --port 4000 --detach \ No newline at end of file +bundle exec jekyll serve --watch --port 4000 --detach diff --git a/first-timers.md b/first-timers.md new file mode 100644 index 0000000000..e31a403a0e --- /dev/null +++ b/first-timers.md @@ -0,0 +1,44 @@ +# How To Edit the SendGrid Docs via GitHub + +Editing the SendGrid Documentation is easy! +If you see an error, a typo, or have something you would like to add, you can make your suggestion via GitHub, the content management system we use for the Docs. Once you have submitted your suggestion, the Docs team can easily review it before it is published to the Docs website. + +To make changes to any page on http://sendgrid.com/docs, follow these steps: + +1. Navigate to the page you would like to edit and click **View and Edit** in the upper right-hand corner. + +<img src="https://github.com/sendgrid/docs/blob/develop/source/img/docs_view_and_edit.png" width="800" height="500"> + +This will take you to the sendgrid.com/docs GitHub repository, or repo. This is where our docs pages are stored. + +2. If you do not already have a GitHub account, you will have to create one in order to suggest a change. Click the Sign up link in the upper right-hand corner to create an account. Enter your username, password, and email address. If you are an employee of SendGrid, please use your full name with your GitHub account and enter SendGrid as your company so we can easily identify you. + +<img src="https://github.com/sendgrid/docs/blob/develop/source/img/docs_signup.png" width="800" height="500"> + +Once you are viewing a Docs page in GitHub, click the pencil icon to begin editing: + +<img src="https://github.com/sendgrid/docs/blob/develop/source/img/docs_edit_github.png" width="800" height="500"> + + +3. Once you have made your changes, you will be given the option of creating a new branch in a Pull Request. This is a request to create a copy, or branch, of the original Docs but with your changes. Once your changes are approved, your branch will then be merged back into the original. + + +4. To create a Pull Request, you’ll have to fill out a Commit Changes form. Follow the built-in template and provide information about any changes you have made to the page. Leave the default branch option and name. + + +5. When done, click **Propose file change**. The Docs Team will be notified of your request. Once we are able to review the change, we will publish it to the site! + + +> All contributors to the SendGrid docs repo need to sign a CLA before their changes can be merged. + +The SendGrid Documentation must follow certain style guidelines. While many of these guidelines are not applicable to small changes, it is important to make sure that our Docs are: + +* Concise +* Accurate +* Organized +* Scannable + +Docs contributors should strive for a professional and “coach-like” tone of voice. Avoid vague language, and get right to the point. Long and overly complicated explanations are not helpful to a user who wants a quick-and-easy answer. Please don’t be intimidated by these style guidelines. They don’t apply to most minor changes, and more significant changes will be reviewed and edited by the Docs Team before publication. + +If you are making substantial edits or are adding more than a paragraph of new content, feel free to refer to [SendGrid’s Style Guide](https://github.com/sendgrid/docs/blob/develop/styleguide.md). + diff --git a/gulp/config.js b/gulp/config.js index 7655f4d232..6052723cbe 100644 --- a/gulp/config.js +++ b/gulp/config.js @@ -20,8 +20,7 @@ module.exports = { }, delete: { src: [developmentAssets] - }, - jekyll: { + }, jekyll: { development: { src: src, dest: development, @@ -52,12 +51,12 @@ module.exports = { autoprefixer: { browsers: [ 'last 2 versions', - 'safari 5', + 'safari 10.0.1', 'ie 8', 'ie 9', 'opera 12.1', - 'ios 6', - 'android 4' + 'ios 8', + 'android 6' ], cascade: true }, @@ -89,7 +88,7 @@ module.exports = { src: srcAssets + '/bower_components/highlightjs/styles/default.css', dest: productionAssets, options: { - keepSpecialComments: 0 + keepSpecialComments: 1 } } } @@ -116,4 +115,4 @@ module.exports = { // ], // dest: production // } -}; \ No newline at end of file +}; diff --git a/gulp/tasks/default.js b/gulp/tasks/default.js index ff374654b0..19e43c2c9a 100644 --- a/gulp/tasks/default.js +++ b/gulp/tasks/default.js @@ -1,3 +1,3 @@ var gulp = require('gulp'); -gulp.task('default', ['watch']); \ No newline at end of file +gulp.task('default', ['watch']); diff --git a/gulp/tasks/development/browser-sync.js b/gulp/tasks/development/browser-sync.js index 96f232d4e7..1a613973af 100644 --- a/gulp/tasks/development/browser-sync.js +++ b/gulp/tasks/development/browser-sync.js @@ -7,4 +7,4 @@ var config = require('../../config').browsersync.development; */ gulp.task('browsersync', ['build'], function() { browsersync(config); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/build.js b/gulp/tasks/development/build.js index f1efa636b2..8aff50d55e 100644 --- a/gulp/tasks/development/build.js +++ b/gulp/tasks/development/build.js @@ -10,4 +10,4 @@ gulp.task('build', function(callback) { 'less', // 'scripts' ], callback); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/delete.js b/gulp/tasks/development/delete.js index 143387ce7e..b8787d3fc7 100644 --- a/gulp/tasks/development/delete.js +++ b/gulp/tasks/development/delete.js @@ -7,4 +7,4 @@ var config = require('../../config').delete; */ gulp.task('delete', function(callback) { del(config.src, callback); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/jekyll.js b/gulp/tasks/development/jekyll.js index 49f4aeafe7..7bd528ddb8 100644 --- a/gulp/tasks/development/jekyll.js +++ b/gulp/tasks/development/jekyll.js @@ -15,4 +15,4 @@ gulp.task('jekyll', function(done) { gulp.task('jekyll-rebuild', ['jekyll'], function() { browsersync.reload(); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/jshint.js b/gulp/tasks/development/jshint.js index 7e8e2c2d64..60942a707b 100644 --- a/gulp/tasks/development/jshint.js +++ b/gulp/tasks/development/jshint.js @@ -10,4 +10,4 @@ gulp.task('jshint', function() { return gulp.src(config.src) .pipe(jshint()) .pipe(jshint.reporter(stylish)); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/less-lint.js b/gulp/tasks/development/less-lint.js index 4d9b87d0a6..1b553501ce 100644 --- a/gulp/tasks/development/less-lint.js +++ b/gulp/tasks/development/less-lint.js @@ -8,4 +8,4 @@ var config = require('../../config').lesslint; gulp.task('lesslint', function() { return gulp.src(config.lesslint.src) .pipe(recess(config.lesslint.options)); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/less.js b/gulp/tasks/development/less.js index 406f25a5ad..4f290dc182 100644 --- a/gulp/tasks/development/less.js +++ b/gulp/tasks/development/less.js @@ -13,4 +13,4 @@ gulp.task('less', function () { .pipe(prefix(config.autoprefixer)) .pipe(gulp.dest(config.less.dest)) .pipe(browsersync.reload({stream:true})); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/optimize-css.js b/gulp/tasks/development/optimize-css.js index f1283fc28d..6aab8b70a4 100644 --- a/gulp/tasks/development/optimize-css.js +++ b/gulp/tasks/development/optimize-css.js @@ -11,4 +11,4 @@ gulp.task('optimize:css', function() { .pipe(minifycss(config.options)) .pipe(gulp.dest(config.dest)) .pipe(size()); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/rev-collector.js b/gulp/tasks/development/rev-collector.js index 9a097a2221..e8f7b3cf1c 100644 --- a/gulp/tasks/development/rev-collector.js +++ b/gulp/tasks/development/rev-collector.js @@ -10,4 +10,4 @@ gulp.task('rev:collect', function() { return gulp.src(config.src) .pipe(collect()) .pipe(gulp.dest(config.dest)); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/revision.js b/gulp/tasks/development/revision.js index d8d8d269c3..eb2b69eb28 100644 --- a/gulp/tasks/development/revision.js +++ b/gulp/tasks/development/revision.js @@ -13,4 +13,4 @@ gulp.task('revision', function() { .pipe(gulp.dest(config.dest.assets)) .pipe(rev.manifest({ path: config.dest.manifest.name })) .pipe(gulp.dest(config.dest.manifest.path)); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/scripts.js b/gulp/tasks/development/scripts.js index a95c1cc180..32f6200724 100644 --- a/gulp/tasks/development/scripts.js +++ b/gulp/tasks/development/scripts.js @@ -6,4 +6,4 @@ gulp.task('scripts', function() { return gulp.src(config.scripts.src) .pipe(concat('app.js')) .pipe(gulp.dest(config.scripts.dest)); -}); \ No newline at end of file +}); diff --git a/gulp/tasks/development/watch.js b/gulp/tasks/development/watch.js index 7a8fc9835a..502dfeb59e 100644 --- a/gulp/tasks/development/watch.js +++ b/gulp/tasks/development/watch.js @@ -17,4 +17,4 @@ gulp.task('watch', ['browsersync'], function () { gulp.watch('source/_layouts/*.html,xml', ['jekyll-rebuild']); gulp.watch('source/_assets/stylesheets/**/*.less', ['less']); gulp.watch('source/_assets/javascripts/**/*.less', ['jekyll-rebuild']); -}); \ No newline at end of file +}); diff --git a/gulp/util/handleErrors.js b/gulp/util/handleErrors.js index a9f2834903..a6e481da3e 100644 --- a/gulp/util/handleErrors.js +++ b/gulp/util/handleErrors.js @@ -12,4 +12,4 @@ module.exports = function() { // Keep gulp from hanging on this task this.emit('end'); -}; \ No newline at end of file +}; diff --git a/gulpfile.js b/gulpfile.js index 972d1e8110..44f5f45468 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -13,4 +13,4 @@ var requireDir = require('require-dir'); // Require all tasks in gulp/tasks, including subfolders -requireDir('./gulp/tasks', { recurse: true }); \ No newline at end of file +requireDir('./gulp/tasks', { recurse: true }); diff --git a/license b/license index 71327ab25d..daa4724b65 100644 --- a/license +++ b/license @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright © 2008-2015 SendGrid Inc. +Copyright © 2013-2017 SendGrid Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/linklint-2.3.5 b/linklint-2.3.5 index 2b31eb2bd0..4d9addcc0e 100755 --- a/linklint-2.3.5 +++ b/linklint-2.3.5 @@ -2,7 +2,7 @@ #========================================================================== # linklint - a fast link checker and web site maintenance tool. -# Copyright (C) 1997 -- 2001 James B. Bowlin. All rights reserved. +# Copyright (C) 1997 -- 2001 James B. Bowlin. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -11,7 +11,7 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License @@ -26,7 +26,7 @@ # and because of this, it can be redistributed and modified under the # conditions of this license, but the software remains __copyrghted__ # by the author. Don't intermix this with the general meaning of -# Public Domain software or such a derivated distribution label. +# Public Domain software or such a derivated distribution label. # # Linklint is a total rewrite of Rick Jansen's 4/15/96 version of webxref. # @@ -90,15 +90,15 @@ USAGE1 $Usage3 = qq~ Use $prog with no arguments for standard usage. -Use "$prog -help_all" for a list of ALL options. +Use "$prog -help_all" for a list of ALL options. ~; $Version_Usage = <<VERSION_USAGE; $Usage1 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. VERSION_USAGE @@ -116,17 +116,17 @@ $LICENSE = <<LICENSE_TEXT; Preamble The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public +freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This +software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by +using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you +price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it @@ -139,8 +139,8 @@ distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and @@ -149,15 +149,15 @@ distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we +software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free +patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any +program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and @@ -169,16 +169,16 @@ modification follow. 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, +under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in +language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of +covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). @@ -215,15 +215,15 @@ above, provided that you also meet all of these conditions: notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but + License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) -These requirements apply to the modified work as a whole. If +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you +sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the @@ -255,16 +255,16 @@ Sections 1 and 2 above provided that you also do one of the following: customarily used for software interchange; or, c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is + to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source +making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a +control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the @@ -278,7 +278,7 @@ distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt +except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under @@ -286,9 +286,9 @@ this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying @@ -297,7 +297,7 @@ the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further +these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. @@ -306,10 +306,10 @@ this License. infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot +excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent +may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to @@ -324,7 +324,7 @@ It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is -implemented by public license practices. Many people have made +implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing @@ -339,39 +339,39 @@ certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates +countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will +of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Program +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of +Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free +to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals +make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @@ -396,7 +396,7 @@ Usage: linklint \@file \@\@file -flag [option] linkset linkset ... -host name[:port] Use "name" as domain name of site. -http Check site remotely via http (requires -host). -net Check status of remote http links found in site. - -help Show help. (Use "-help_all for complete usage). + -help Show help. (Use "-help_all for complete usage). -version Show version info. Multi File Output: @@ -410,7 +410,7 @@ Single File Output: linkset: home page only: / (default) root dir only: /# entire site: /@ and all subdirs: /#/# - specific links: /link1 /link2 ... "sub" dir and below: /sub/@ + specific links: /link1 /link2 ... "sub" dir and below: /sub/@ USAGE $Help2 = <<'HELP2'; @@ -473,13 +473,13 @@ $Examples = << 'EXAMPLES'; Examples: 1) linklint -doc linkdoc -root dir - Checks home page. Output files go in "linkdoc" directory. + Checks home page. Output files go in "linkdoc" directory. 2) linklint -doc linkdoc -root dir /@ - Checks all files under "dir". Output files go in "linkdoc" directory. + Checks all files under "dir". Output files go in "linkdoc" directory. 3) linklint -doc linkdoc -root dir /@ -net - Checks site as (2). Then checks all http links found in site. + Checks site as (2). Then checks all http links found in site. 4) linklint -doc linkdoc -root dir /# Like (2) but only checks files in the root directory. @@ -1026,7 +1026,7 @@ $UrlOk = $Abort = 0; #-------------------------------------------------------------------------- # UniqueUrl($url) # -# Make a URL Unique. Decode "/../" and "." in the path of full URL's +# Make a URL Unique. Decode "/../" and "." in the path of full URL's # Do same for relative URL's But also completes the path # if it does not start with a "/". #-------------------------------------------------------------------------- @@ -1100,8 +1100,8 @@ sub UniqueUrl #-------------------------------------------------------------------------- # WasCached($link, $referer) # -# Does some quick checks on $link. Return 1 if we are done with it. -# Return 0 if it should be checked further. Also bails out early +# Does some quick checks on $link. Return 1 if we are done with it. +# Return 0 if it should be checked further. Also bails out early # If we know we will not have to process any further. #-------------------------------------------------------------------------- @@ -1251,7 +1251,7 @@ sub LinkLocal #-------------------------------------------------------------------------- # MapLink($link, $referer) # -# Resolves my server maps for $link. Returns new $link or '' if +# Resolves my server maps for $link. Returns new $link or '' if # the new link was already cached. #-------------------------------------------------------------------------- @@ -1281,7 +1281,7 @@ sub MapLink #-------------------------------------------------------------------------- # StopRecursion($link, $referer) # -# Stops recursion as needed. Also records skipped files. +# Stops recursion as needed. Also records skipped files. #-------------------------------------------------------------------------- sub StopRecursion @@ -1305,7 +1305,7 @@ sub StopRecursion #-------------------------------------------------------------------------- # LinkRemote($link, $referer) # -# Checks $link via http. If it is an html file it is parsed and +# Checks $link via http. If it is an html file it is parsed and # the results go into local lists maintained by LinkLink(). #-------------------------------------------------------------------------- @@ -1576,7 +1576,7 @@ sub SetProtoJS # FixTag(*HANDLE, $att) # # Reads in the remainder of a tag if there was a bare "<" inside the -# the tag. Only works if "<" was inside of single or double quotes. +# the tag. Only works if "<" was inside of single or double quotes. # This is slow but we only get here on rare occasions. #-------------------------------------------------------------------------- @@ -1677,8 +1677,8 @@ sub ParseMap #-------------------------------------------------------------------------- # $url = ParseRedirect(*HANDLE, $link) # -# Reads text from FILE until end of <head> element. Uses $link for -# error messages. Returns $url with redirected $url if given otherwise +# Reads text from FILE until end of <head> element. Uses $link for +# error messages. Returns $url with redirected $url if given otherwise # returns ''. #-------------------------------------------------------------------------- @@ -1898,7 +1898,7 @@ sub ProcessLocal { # PrintOutput(*form, *summary, $docdir, $sumfile, $indexfile, $title) # # A wrapper for a printing routines. Computes counts of # of elements -# in all hashes (need scalars). Inverts some hashes for forward +# in all hashes (need scalars). Inverts some hashes for forward # results. Prints output to files in $DocDir or to "std" output. #-------------------------------------------------------------------------- @@ -1971,8 +1971,8 @@ sub PrintFiles # # A co-conspirator with PrintFiles(). # $file is the name of a file (sans extension) to be written in -# $DocDir. $anydata tells us if there is any data to be written -# to the file. Always erase old copies of all the files but save +# $DocDir. $anydata tells us if there is any data to be written +# to the file. Always erase old copies of all the files but save # a backup copy if the file might be theirs. # If $DocDir is 0 then create the filename $DOCFILE and return # $anydata. If $anydata is 0 don't create a new file and return ''. @@ -2125,7 +2125,7 @@ sub PrintDocDir # HtmlDoc($in, $out, *map, *skip, $base) # # Reads txt file $in, writes html file $out, adding anchors -# to lines that start with "/" or "scheme:". Sets the base +# to lines that start with "/" or "scheme:". Sets the base # to $base if provided, maps links found in %map, does not # add anchors to links found in *skip. #-------------------------------------------------------------------------- @@ -2308,9 +2308,9 @@ sub Plural #-------------------------------------------------------------------------- # PrintList(*list, $header, $xref, $subhead) # -# Print out keys (and values if $xref) of %list. Prepend "$DOCFILE: " -# to header if $DOCHEAD is set. Append "(cross referenced)" to header -# if $xref == 2. Only print header if $SUM is set. +# Print out keys (and values if $xref) of %list. Prepend "$DOCFILE: " +# to header if $DOCHEAD is set. Append "(cross referenced)" to header +# if $xref == 2. Only print header if $SUM is set. #-------------------------------------------------------------------------- sub PrintList @@ -2340,7 +2340,7 @@ sub PrintList #-------------------------------------------------------------------------- # PrintSubList($sublist, $subhead, $indent) # -# Prints out all elements of $sublist split by "\n". Prints out the +# Prints out all elements of $sublist split by "\n". Prints out the # number of elements in pluralized $subhead. #-------------------------------------------------------------------------- @@ -2359,10 +2359,10 @@ sub PrintSubList #-------------------------------------------------------------------------- # PrintLISTS(*list, *heads, $xref) # -# Split %list into sublists and then prints each sublist. The +# Split %list into sublists and then prints each sublist. The # splitting is controlled by @heads. Each line of @heads must be in the # form "$heading::$regexp" All keys of %list that match %regexp are -# printed out under the heading $heading. If regexp contains 'unknown' +# printed out under the heading $heading. If regexp contains 'unknown' # then all remaining items in %list are printed out under its $heading. # If $SUM == 2 then a summary of all keys %list is printed using the # first heading format which is otherwise ignored. @@ -2426,7 +2426,7 @@ sub PrintUrl #-------------------------------------------------------------------------- # PrintSubUrl # -# Prints out all elements of $sublist split by "\n". Prints out the +# Prints out all elements of $sublist split by "\n". Prints out the # number of elements in pluralized $subhead. #-------------------------------------------------------------------------- @@ -2447,7 +2447,7 @@ sub PrintSubUrl # PrintUrlRedir($url) # # Prints "linked list" of where $url was moved to due to 3XX status -# codes. Always returns if an infinite loop ( a -> b -> a ...) +# codes. Always returns if an infinite loop ( a -> b -> a ...) # occurs. #--------------------------------------------------------------------------- @@ -2565,7 +2565,7 @@ sub InvertKeys # named anchors wanted: %want{link#frag} = "ref1 \n ref2 \n ..." # named anchors found: %found{link#frag} = 1 # Fills *found and *lost as appropriate for found and lost named -# anchors. Works for named maps too. +# anchors. Works for named maps too. #-------------------------------------------------------------------------- sub ResolveAnch @@ -2610,7 +2610,7 @@ sub HashUnique #-------------------------------------------------------------------------- # Warn(@msg) # -# Registers this warning in %Warn. If $link is supplied we cross +# Registers this warning in %Warn. If $link is supplied we cross # reference the warning to $link. #-------------------------------------------------------------------------- @@ -2685,7 +2685,7 @@ sub AppendList # PushDir($newdir) # # Pushes current directory onto a stack @DIRS and then -# chdir's to $newdir. We Assume that $newdir is a full path! +# chdir's to $newdir. We Assume that $newdir is a full path! # Returns O if there is an error. #-------------------------------------------------------------------------- @@ -2756,7 +2756,7 @@ sub Regular # LinkSet($flag, *in) # # Fills $out with regular exppression made out that is the or'ed -# of the the specs in @in. Fills %out with all of the keys +# of the the specs in @in. Fills %out with all of the keys # that were literal expresions. #-------------------------------------------------------------------------- @@ -2775,7 +2775,7 @@ sub LinkSet # LinkSet1($exp) # # If $exp does not contain ()[]^| or $ then it is converted to a -# literal expression. If this expression contains ? or * then these +# literal expression. If this expression contains ? or * then these # are converted to [^/]* and .* and the whole thing is anchored to the # start and end. Otherwise check $exp to be a valid regular expression. #-------------------------------------------------------------------------- @@ -2883,8 +2883,8 @@ sub ReadHttp # ReadBack($file) # # Reads in $file as if it were the remoteX.txt file generated by -# Linklint. %ExtLink if filled with the cross references found -# in the file. Returns a list of all urls found. +# Linklint. %ExtLink if filled with the cross references found +# in the file. Returns a list of all urls found. #-------------------------------------------------------------------------- sub ReadBack @@ -2917,12 +2917,12 @@ sub SetHash # ReadArgs(@args) # # Reads arguments from @args (all start with "-") returns the -# remainder of @args. We first check for full flags and options. +# remainder of @args. We first check for full flags and options. # If these don't match exactly we go through the argument looking -# for short flags and options 'globbed' together. Flags set -# $Arg{'X'} to 1. For short flags X is the flag, for full flags X -# is the first character. Short options set $Arg{'X'} to the next -# argument. Full options set $X to the next argument where X +# for short flags and options 'globbed' together. Flags set +# $Arg{'X'} to 1. For short flags X is the flag, for full flags X +# is the first character. Short options set $Arg{'X'} to the next +# argument. Full options set $X to the next argument where X # is the value from %fullopts. ZZZ Has been modified. #-------------------------------------------------------------------------- @@ -3257,8 +3257,8 @@ sub CheckURLS #-------------------------------------------------------------------------- # $flag = UrlMoved($flag, $url) # -# Process 3XX status. Recheck $url given back in Location field -# of HEADER. Continue until +# Process 3XX status. Recheck $url given back in Location field +# of HEADER. Continue until # a) non-3XX status, b) infinite loop c) already checked. #-------------------------------------------------------------------------- @@ -3319,7 +3319,7 @@ sub Parse #-------------------------------------------------------------------------- # $flag = CheckUrl($url, $recheck) # -# Returns status of a URL. Uses the robots.txt protocol. +# Returns status of a URL. Uses the robots.txt protocol. # If $Arg{'redirect'} uses "GET" with html files otherwise # tries a "HEAD" first and if that fails tries "GET". #-------------------------------------------------------------------------- @@ -3416,8 +3416,8 @@ sub CheckModified #-------------------------------------------------------------------------- # GetModified($flag, *S) # -# Passed to request4(). Only get here if file was modified or -# "If-Modified-Since" was ignored. Check last-mod date 1st. +# Passed to request4(). Only get here if file was modified or +# "If-Modified-Since" was ignored. Check last-mod date 1st. # then check checksum only if they ask and if the $time was > 0. # If $csum == -1 then don't bother with checksum. #-------------------------------------------------------------------------- @@ -3487,7 +3487,7 @@ sub Recheck #-------------------------------------------------------------------------- # $flag = Disallowed($url) # -# Checks robots.txt file for $url. Results are cached for each host. +# Checks robots.txt file for $url. Results are cached for each host. # Returns: # -10 if access is excluded by robots.txt # 0 if access is allowed @@ -3622,8 +3622,8 @@ sub GetText # by gethostbyname() and we get StatRetry errors. # # Use subroutine getmethod($flag, 'S', @params) if given -# to read data after the header. I don't have a great method for -# sending data back at the moment. Use globals for now. +# to read data after the header. I don't have a great method for +# sending data back at the moment. Use globals for now. #-------------------------------------------------------------------------- sub Request @@ -4007,7 +4007,7 @@ sub OtherStatus # ReadCache($file, $type, *hash) # # Reads $file, looking for key val1 on each line. -# Fills hash{key} = val1. Skips entries that have expired. +# Fills hash{key} = val1. Skips entries that have expired. # Sets $OpenedCache{$type} to $file for writing later. # Also used to only read the cache file once. #-------------------------------------------------------------------------- @@ -4042,7 +4042,7 @@ sub WriteCaches #-------------------------------------------------------------------------- # WriteCache($type, *hash) # -# Writes key(hash1) value(hash1) to file. Preceded by $header. +# Writes key(hash1) value(hash1) to file. Preceded by $header. # Will only write if cache was opened via ReadCache() and if the # cache has been tainted via %TaintCache. #-------------------------------------------------------------------------- diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..4674d8040d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8220 @@ +{ + "name": "docs", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@gulp-sourcemaps/identity-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz", + "integrity": "sha1-z6I7xYQPkQTOMqZedNt+epdLvuE=", + "dev": true, + "requires": { + "acorn": "5.1.2", + "css": "2.2.1", + "normalize-path": "2.1.1", + "source-map": "0.5.7", + "through2": "2.0.3" + }, + "dependencies": { + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "requires": { + "normalize-path": "2.1.1", + "through2": "2.0.3" + } + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + }, + "dependencies": { + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + } + } + }, + "accord": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/accord/-/accord-0.27.3.tgz", + "integrity": "sha1-f7kSlwkoXK6oTrNyxOiCAxtxOOg=", + "dev": true, + "requires": { + "convert-source-map": "1.5.0", + "glob": "7.1.2", + "indx": "0.2.3", + "lodash.clone": "4.5.0", + "lodash.defaults": "4.2.0", + "lodash.flatten": "4.4.0", + "lodash.merge": "4.6.0", + "lodash.partialright": "4.2.1", + "lodash.pick": "4.4.0", + "lodash.uniq": "4.5.0", + "resolve": "1.4.0", + "semver": "5.4.1", + "uglify-js": "2.8.29", + "when": "3.7.8" + }, + "dependencies": { + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", + "dev": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=" + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=" + }, + "ansicolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "archy": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", + "integrity": "sha1-kQ9Dv2YUH8M1VkWXq8GJ30Sz014=" + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-differ": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-0.1.0.tgz", + "integrity": "sha1-EuLJtwa+1HyLSDtX5IdHP7CGHzo=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-slice": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.0.0.tgz", + "integrity": "sha1-5zA08A3MH0CHYAj9IP6ud71LfC8=", + "dev": true + }, + "array-union": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-0.1.0.tgz", + "integrity": "sha1-7emAiDMGZeaZ4evwIny8YDTmJ9s=", + "dev": true, + "requires": { + "array-uniq": "0.1.1" + } + }, + "array-uniq": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-0.1.1.tgz", + "integrity": "sha1-WGHz7U5LthdVl6TgeOiqeOvpWMc=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", + "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=", + "dev": true + }, + "autoprefixer": { + "version": "6.7.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", + "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", + "dev": true, + "requires": { + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000748", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.0" + } + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=", + "dev": true + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "requires": { + "buffers": "0.1.1", + "chainsaw": "0.1.0" + } + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "requires": { + "readable-stream": "1.0.34" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "requires": { + "hoek": "0.9.1" + } + }, + "bower": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.3.12.tgz", + "integrity": "sha1-N94O2zkEuvkK7hM4Sho3mgXuIUw=", + "requires": { + "abbrev": "1.0.9", + "archy": "0.0.2", + "bower-config": "0.5.3", + "bower-endpoint-parser": "0.2.2", + "bower-json": "0.4.0", + "bower-logger": "0.2.2", + "bower-registry-client": "0.2.4", + "cardinal": "0.4.0", + "chalk": "0.5.0", + "chmodr": "0.1.0", + "decompress-zip": "0.0.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "glob": "4.0.6", + "graceful-fs": "3.0.11", + "handlebars": "2.0.0", + "inquirer": "0.7.1", + "insight": "0.4.3", + "is-root": "1.0.0", + "junk": "1.0.3", + "lockfile": "1.0.3", + "lru-cache": "2.5.2", + "mkdirp": "0.5.0", + "mout": "0.9.1", + "nopt": "3.0.6", + "opn": "1.0.2", + "osenv": "0.1.0", + "p-throttler": "0.1.0", + "promptly": "0.2.0", + "q": "1.0.1", + "request": "2.42.0", + "request-progress": "0.3.0", + "retry": "0.6.0", + "rimraf": "2.2.8", + "semver": "2.3.2", + "shell-quote": "1.4.3", + "stringify-object": "1.0.1", + "tar-fs": "0.5.2", + "tmp": "0.0.23", + "update-notifier": "0.2.0", + "which": "1.0.9" + } + }, + "bower-config": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.3.tgz", + "integrity": "sha1-mPxbQah4cO+cu5KXY1z4H1UF/bE=", + "requires": { + "graceful-fs": "2.0.3", + "mout": "0.9.1", + "optimist": "0.6.1", + "osenv": "0.0.3" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "osenv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", + "integrity": "sha1-zWrY3bKQkVrZ4idlV2Al1BHynLY=" + } + } + }, + "bower-endpoint-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz", + "integrity": "sha1-ALVlrb+rby01rd3pd+l5Yqy8s/Y=" + }, + "bower-json": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", + "integrity": "sha1-qZw8z0Fu8FkO0N7SUsdg8cbZN2Y=", + "requires": { + "deep-extend": "0.2.11", + "graceful-fs": "2.0.3", + "intersect": "0.0.3" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + } + } + }, + "bower-logger": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz", + "integrity": "sha1-Ob4H6Xmy/I4DqUY0IF7ZQiNz04E=" + }, + "bower-registry-client": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.2.4.tgz", + "integrity": "sha1-Jp/H6Ji2J/uTnRFEpZMlTX+77rw=", + "requires": { + "async": "0.2.10", + "bower-config": "0.5.3", + "graceful-fs": "2.0.3", + "lru-cache": "2.3.1", + "mkdirp": "0.3.5", + "request": "2.51.0", + "request-replay": "0.2.0", + "rimraf": "2.2.8" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "lru-cache": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz", + "integrity": "sha1-s632s9hW6VTiw5DmzvIggSRaU9Y=" + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + }, + "request": { + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", + "integrity": "sha1-NdALvswBLlX5B7G9ng29V3v+8m4=", + "requires": { + "aws-sign2": "0.5.0", + "bl": "0.9.5", + "caseless": "0.8.0", + "combined-stream": "0.0.7", + "forever-agent": "0.5.2", + "form-data": "0.2.0", + "hawk": "1.1.1", + "http-signature": "0.10.1", + "json-stringify-safe": "5.0.1", + "mime-types": "1.0.2", + "node-uuid": "1.4.8", + "oauth-sign": "0.5.0", + "qs": "2.3.3", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3" + } + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-sync": { + "version": "2.18.13", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.18.13.tgz", + "integrity": "sha512-qhdrmgshVGwweogT/bdOKkZDxVxqiF4+9mibaDeAxvDBeoUtdgABk5x7YQ1KCcLRchAfv8AVtp9NuITl5CTNqg==", + "dev": true, + "requires": { + "browser-sync-client": "2.5.1", + "browser-sync-ui": "0.6.3", + "bs-recipes": "1.3.4", + "chokidar": "1.7.0", + "connect": "3.5.0", + "dev-ip": "1.0.1", + "easy-extender": "2.3.2", + "eazy-logger": "3.0.2", + "emitter-steward": "1.0.0", + "fs-extra": "3.0.1", + "http-proxy": "1.15.2", + "immutable": "3.8.1", + "localtunnel": "1.8.3", + "micromatch": "2.3.11", + "opn": "4.0.2", + "portscanner": "2.1.1", + "qs": "6.2.1", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "serve-index": "1.8.0", + "serve-static": "1.12.2", + "server-destroy": "1.0.1", + "socket.io": "1.6.0", + "socket.io-client": "1.6.0", + "ua-parser-js": "0.7.12", + "yargs": "6.4.0" + }, + "dependencies": { + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "qs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz", + "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=", + "dev": true + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + } + } + }, + "browser-sync-client": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.5.1.tgz", + "integrity": "sha1-7BrWmknC4tS2RbGLHAbCmz2a+Os=", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.3.0" + } + }, + "browser-sync-ui": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-0.6.3.tgz", + "integrity": "sha1-ZApTfBgGiTA9W+krxHa568RBwLw=", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "1.4.0", + "immutable": "3.8.1", + "server-destroy": "1.0.1", + "stream-throttle": "0.1.3", + "weinre": "2.0.0-pre-I0Z7U9OV" + } + }, + "browserslist": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", + "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", + "dev": true, + "requires": { + "caniuse-db": "1.0.30000748", + "electron-to-chromium": "1.3.27" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + }, + "bufferstreams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-1.0.1.tgz", + "integrity": "sha1-z7GtlWjTujz+k1upq92VLeiKqyo=", + "dev": true, + "requires": { + "readable-stream": "1.0.34" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-db": { + "version": "1.0.30000748", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000748.tgz", + "integrity": "sha1-eF2e381kW/eVxv887TPEXVgMSKA=", + "dev": true + }, + "cardinal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.0.tgz", + "integrity": "sha1-fRCq+yCDe94EPEXkOgyMKM2q5F4=", + "requires": { + "redeyed": "0.4.4" + } + }, + "caseless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz", + "integrity": "sha1-W8oogdQUN/VLJAfr40iIx7mtT30=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "requires": { + "traverse": "0.3.9" + } + }, + "chalk": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.0.tgz", + "integrity": "sha1-N138y8IcCmCothvFt489wqVcIS8=", + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + } + }, + "chmodr": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz", + "integrity": "sha1-4JIVodUVQtsqJXaWl2W89hJVg+s=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "dev": true, + "requires": { + "commander": "2.8.1", + "source-map": "0.4.4" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "cli-color": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", + "integrity": "sha1-EtW90Vj/igsNtAEZiRPAPfBp9vU=", + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.35", + "memoizee": "0.3.10", + "timers-ext": "0.1.2" + } + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "cli-usage": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.4.tgz", + "integrity": "sha1-fAHg3HBsI0s5yTODjI4gshdXduI=", + "dev": true, + "requires": { + "marked": "0.3.7", + "marked-terminal": "1.7.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "1.0.7", + "through2": "2.0.3" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "requires": { + "delayed-stream": "0.0.5" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-with-sourcemaps": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz", + "integrity": "sha1-9Vs74q60dgGxCi1SWcz7cP0vHdY=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "config-chain": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "requires": { + "ini": "1.3.4", + "proto-list": "1.2.4" + } + }, + "configstore": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz", + "integrity": "sha1-JeTBbDdoq/dcWmW8YXYfSVBVtFk=", + "requires": { + "graceful-fs": "3.0.11", + "js-yaml": "3.10.0", + "mkdirp": "0.5.0", + "object-assign": "2.1.1", + "osenv": "0.1.0", + "user-home": "1.1.1", + "uuid": "2.0.3", + "xdg-basedir": "1.0.1" + }, + "dependencies": { + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" + } + } + }, + "connect": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.5.0.tgz", + "integrity": "sha1-s1dSWgtMH1BZnNmD4dnv7qlncZg=", + "dev": true, + "requires": { + "debug": "2.2.0", + "finalhandler": "0.5.0", + "parseurl": "1.3.2", + "utils-merge": "1.0.0" + } + }, + "connect-history-api-fallback": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz", + "integrity": "sha1-PbJPlz9LkjsOgvYZzg3wJBHKYj0=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "requires": { + "boom": "0.4.2" + } + }, + "css": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", + "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "source-map": "0.1.43", + "source-map-resolve": "0.3.1", + "urix": "0.1.0" + } + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "d": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha1-2hhMU10Y2O57oqoim5FACfrhEwk=", + "requires": { + "es5-ext": "0.10.35" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "deap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.0.tgz", + "integrity": "sha1-sUi/gkMKJ2mbdIOgPra2dYW/yIg=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "debug-fabulous": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.2.1.tgz", + "integrity": "sha512-u0TV6HcfLsZ03xLBhdhSViQMldaiQ2o+8/nSILaXkuNSWvxkx66vYJUAam0Eu7gAilJRX/69J4kKdqajQPaPyw==", + "dev": true, + "requires": { + "debug": "3.1.0", + "memoizee": "0.4.11", + "object-assign": "4.1.1" + }, + "dependencies": { + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.35" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "memoizee": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.11.tgz", + "integrity": "sha1-vemBdmPJ5A/bKk6hw2cpYIeujI8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-weak-map": "2.0.2", + "event-emitter": "0.3.5", + "is-promise": "2.1.0", + "lru-queue": "0.1.0", + "next-tick": "1.0.0", + "timers-ext": "0.1.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decompress-zip": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.8.tgz", + "integrity": "sha1-SiZbIseyCdeyT6ZvKy37ztWQRPM=", + "requires": { + "binary": "0.3.0", + "graceful-fs": "3.0.11", + "mkpath": "0.1.0", + "nopt": "2.2.1", + "q": "1.0.1", + "readable-stream": "1.1.14", + "touch": "0.0.2" + }, + "dependencies": { + "nopt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", + "integrity": "sha1-KqCbfRdoSHs7ianFqlIzW/8Lrqc=", + "requires": { + "abbrev": "1.0.9" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + }, + "deep-extend": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz", + "integrity": "sha1-eha6aXKRMjQFBhcElLyD9wdv4I8=" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.2" + } + }, + "del": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/del/-/del-0.1.3.tgz", + "integrity": "sha1-LXJKcZtaz1wLhAtCJHFeg4QGpBk=", + "dev": true, + "requires": { + "each-async": "1.1.1", + "globby": "0.1.1", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "rimraf": "2.2.8" + } + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=" + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", + "dev": true, + "requires": { + "fs-exists-sync": "0.1.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + }, + "each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "dev": true, + "requires": { + "onetime": "1.1.0", + "set-immediate-shim": "1.0.1" + } + }, + "easy-extender": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz", + "integrity": "sha1-PTJI/r4rFZYHMW2PnPSRwWZIIh0=", + "dev": true, + "requires": { + "lodash": "3.10.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "eazy-logger": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz", + "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=", + "dev": true, + "requires": { + "tfunk": "3.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", + "dev": true + }, + "emitter-steward": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emitter-steward/-/emitter-steward-1.0.0.tgz", + "integrity": "sha1-80Ea3pdYp1Zd+Eiy2gy70bRsvWQ=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "end-of-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", + "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "engine.io": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.0.tgz", + "integrity": "sha1-PutfJky3XbvsG6rqJtYfWk6s4qo=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "0.1.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "ws": "1.1.1" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.0.tgz", + "integrity": "sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.1", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.1.tgz", + "integrity": "sha1-lVTxrjMQfW+9FwylRm0vgz9qB88=", + "dev": true, + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.6", + "wtf-8": "1.0.0" + }, + "dependencies": { + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "optional": true, + "requires": { + "prr": "0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" + }, + "dependencies": { + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.35" + } + } + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + }, + "dependencies": { + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.35" + } + } + } + }, + "es6-weak-map": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", + "integrity": "sha1-cGzvnpmqI2undmwjnIueKG6n0ig=", + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.35", + "es6-iterator": "0.1.3", + "es6-symbol": "2.0.1" + }, + "dependencies": { + "es6-iterator": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", + "integrity": "sha1-1vWLjE/EE8JJtLqhl2j45NfIlE4=", + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.35", + "es6-symbol": "2.0.1" + } + }, + "es6-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", + "integrity": "sha1-dhtcZ8/U8dGK+yNPaR1nhoLLO/M=", + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.35" + } + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + }, + "dependencies": { + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.35" + } + } + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "exec-sh": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "dev": true, + "requires": { + "merge": "1.2.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expand-tilde": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "express": { + "version": "2.5.11", + "resolved": "https://registry.npmjs.org/express/-/express-2.5.11.tgz", + "integrity": "sha1-TOjqHzY15p5J8Ou0l7aksKUc5vA=", + "dev": true, + "requires": { + "connect": "1.9.2", + "mime": "1.2.4", + "mkdirp": "0.3.0", + "qs": "0.4.2" + }, + "dependencies": { + "connect": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-1.9.2.tgz", + "integrity": "sha1-QogKIulDiuWait105Df1iujlKAc=", + "dev": true, + "requires": { + "formidable": "1.0.17", + "mime": "1.2.4", + "qs": "0.4.2" + } + }, + "mime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.4.tgz", + "integrity": "sha1-EbX9rynCUJJVF2uArVIClPXekrc=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + }, + "qs": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.4.2.tgz", + "integrity": "sha1-PKxMhh43GoycR3CsI82o3mObjl8=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true, + "optional": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", + "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", + "dev": true, + "requires": { + "debug": "2.2.0", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "findup-sync": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", + "dev": true, + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.1" + }, + "dependencies": { + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "integrity": "sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=" + }, + "form-data": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "integrity": "sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY=", + "requires": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime-types": "2.0.14" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "mime-types": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", + "requires": { + "mime-db": "1.12.0" + } + } + } + }, + "formidable": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz", + "integrity": "sha1-71SRSQ+UM7cF+qdyScmQKa40hVk=", + "dev": true + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=", + "dev": true + }, + "fs-exists-sync": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "dev": true + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "3.0.1", + "universalify": "0.1.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.0", + "rimraf": "2.2.8" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + } + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.0.6.tgz", + "integrity": "sha1-aVxQvdTi+1xdNwsJHziNNwfikac=", + "requires": { + "graceful-fs": "3.0.11", + "inherits": "2.0.3", + "minimatch": "1.0.0", + "once": "1.4.0" + }, + "dependencies": { + "minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", + "requires": { + "lru-cache": "2.5.2", + "sigmund": "1.0.1" + } + } + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-modules": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", + "dev": true, + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + } + }, + "global-prefix": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.4", + "is-windows": "0.2.0", + "which": "1.3.0" + }, + "dependencies": { + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + } + } + }, + "globby": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-0.1.1.tgz", + "integrity": "sha1-y+xj33JLS+pFi3mhbMDjsfLKhiA=", + "dev": true, + "requires": { + "array-differ": "0.1.0", + "array-union": "0.1.0", + "async": "0.9.2", + "glob": "4.0.6" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.5.2", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "got": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/got/-/got-0.3.0.tgz", + "integrity": "sha1-iI7GbKS8c1qwidvpWUltD3lIVJM=", + "requires": { + "object-assign": "0.3.1" + }, + "dependencies": { + "object-assign": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz", + "integrity": "sha1-Bg4qKifXwNd+x3t48Rqkf9iACNI=" + } + } + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "requires": { + "natives": "1.1.0" + } + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.0.4", + "liftoff": "2.3.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-autoprefixer": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-3.1.1.tgz", + "integrity": "sha1-dSMAUc0NFxND14O36bXREg7u+bA=", + "dev": true, + "requires": { + "autoprefixer": "6.7.7", + "gulp-util": "3.0.8", + "postcss": "5.2.18", + "through2": "2.0.3", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "gulp-changed": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/gulp-changed/-/gulp-changed-1.3.2.tgz", + "integrity": "sha1-nvyNMl+YBcx2aP3059YNSxQQ8s8=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "through2": "2.0.3" + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "1.0.4", + "through2": "2.0.3", + "vinyl": "2.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } + } + }, + "gulp-filter": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-3.0.1.tgz", + "integrity": "sha1-fG/85bVj6J3nqQ387/FuyKjLFWI=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "multimatch": "2.1.0", + "streamfilter": "1.0.5" + } + }, + "gulp-jshint": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/gulp-jshint/-/gulp-jshint-1.12.0.tgz", + "integrity": "sha1-I/vRuv3W+/5h6mRmenSAmpYdA94=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "jshint": "2.9.5", + "lodash": "3.10.1", + "minimatch": "2.0.10", + "rcloader": "0.1.2", + "through2": "0.6.5" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "gulp-less": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-3.3.2.tgz", + "integrity": "sha1-9mNq3MZhUKiQJxn6WZY/x/hipJo=", + "dev": true, + "requires": { + "accord": "0.27.3", + "gulp-util": "3.0.8", + "less": "2.7.2", + "object-assign": "4.1.1", + "through2": "2.0.3", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "gulp-minify-css": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/gulp-minify-css/-/gulp-minify-css-1.2.4.tgz", + "integrity": "sha1-thZJV2Auon+eWtiCJ2ld0gV3jAY=", + "dev": true, + "requires": { + "clean-css": "3.4.28", + "gulp-util": "3.0.8", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "vinyl-bufferstream": "1.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "gulp-notify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-notify/-/gulp-notify-2.2.0.tgz", + "integrity": "sha1-BGyChcKS6X7tThWgCcJsu+XO8TU=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "lodash.template": "3.6.2", + "node-notifier": "4.6.1", + "node.extend": "1.1.6", + "through2": "0.6.5" + }, + "dependencies": { + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "gulp-plumber": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.1.0.tgz", + "integrity": "sha1-8SF2wtBCL2AwbCQv/2oBo5T6ugk=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "through2": "2.0.3" + } + }, + "gulp-recess": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gulp-recess/-/gulp-recess-1.2.0.tgz", + "integrity": "sha1-wlABiUTmcYbhmbK+ldWe9KEAFQw=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "gulp-util": "3.0.8", + "rcloader": "0.1.2", + "recess": "1.1.9", + "through2": "2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-rev": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gulp-rev/-/gulp-rev-2.0.1.tgz", + "integrity": "sha1-DlCtG8/9r+K5v0aebEAgHoBo5KY=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "object-assign": "1.0.0", + "through2": "0.6.5" + }, + "dependencies": { + "object-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-1.0.0.tgz", + "integrity": "sha1-5l3Idm07R7S4MHRlyDEdoDCwcKY=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "gulp-rev-collector": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/gulp-rev-collector/-/gulp-rev-collector-0.1.4.tgz", + "integrity": "sha1-PRL+l4zch7OpyIysDNHMQ26nue4=", + "dev": true, + "requires": { + "gulp-util": "3.0.8", + "through2": "2.0.3", + "underscore": "1.7.0" + } + }, + "gulp-size": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-size/-/gulp-size-2.1.0.tgz", + "integrity": "sha1-HCtk8X+QcdWr2Z0VS3s0gfj7oSg=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "gulp-util": "3.0.8", + "gzip-size": "3.0.0", + "object-assign": "4.1.1", + "pretty-bytes": "3.0.1", + "stream-counter": "1.0.0", + "through2": "2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-sourcemaps": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.1.tgz", + "integrity": "sha512-1qHCI3hdmsMdq/SUotxwUh/L8YzlI6J9zQ5ifNOtx4Y6KV5y5sGuORv1KZzWhuKtz/mXNh5xLESUtwC4EndCjA==", + "dev": true, + "requires": { + "@gulp-sourcemaps/identity-map": "1.0.1", + "@gulp-sourcemaps/map-sources": "1.0.0", + "acorn": "4.0.13", + "convert-source-map": "1.5.0", + "css": "2.2.1", + "debug-fabulous": "0.2.1", + "detect-newline": "2.1.0", + "graceful-fs": "4.1.11", + "source-map": "0.1.43", + "strip-bom-string": "1.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-streamify": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/gulp-streamify/-/gulp-streamify-0.0.5.tgz", + "integrity": "sha1-aF0gUSVSrFdlYktBMbSx7K3wDsE=", + "dev": true, + "requires": { + "gulp-util": "2.2.20", + "plexer": "0.0.2", + "readable-stream": "1.0.34" + }, + "dependencies": { + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "dev": true, + "requires": { + "chalk": "0.5.0", + "dateformat": "1.0.12", + "lodash._reinterpolate": "2.4.1", + "lodash.template": "2.4.1", + "minimist": "0.2.0", + "multipipe": "0.1.2", + "through2": "0.5.1", + "vinyl": "0.2.3" + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=", + "dev": true + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1", + "lodash.keys": "2.4.1" + } + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "dev": true, + "requires": { + "lodash._escapehtmlchar": "2.4.1", + "lodash._reunescapedhtml": "2.4.1", + "lodash.keys": "2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + } + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "dev": true, + "requires": { + "lodash._escapestringchar": "2.4.1", + "lodash._reinterpolate": "2.4.1", + "lodash.defaults": "2.4.1", + "lodash.escape": "2.4.1", + "lodash.keys": "2.4.1", + "lodash.templatesettings": "2.4.1", + "lodash.values": "2.4.1" + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "dev": true, + "requires": { + "lodash._reinterpolate": "2.4.1", + "lodash.escape": "2.4.1" + } + }, + "minimist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "3.0.0" + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "dev": true, + "requires": { + "clone-stats": "0.0.1" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } + } + }, + "gulp-uglify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", + "integrity": "sha1-UkeI2HZm0J+dDCH7IXf5ADmmWMk=", + "dev": true, + "requires": { + "deap": "1.0.0", + "fancy-log": "1.3.0", + "gulp-util": "3.0.8", + "isobject": "2.1.0", + "through2": "2.0.3", + "uglify-js": "2.6.4", + "uglify-save-license": "0.4.1", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "uglify-js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", + "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-watch": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/gulp-watch/-/gulp-watch-4.3.11.tgz", + "integrity": "sha1-Fi/FY96fx3DpH5p845VVE6mhGMA=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "chokidar": "1.7.0", + "glob-parent": "3.1.0", + "gulp-util": "3.0.8", + "object-assign": "4.1.1", + "path-is-absolute": "1.0.1", + "readable-stream": "2.3.3", + "slash": "1.0.0", + "vinyl": "1.2.0", + "vinyl-file": "2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.0" + } + }, + "gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "handlebars": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-2.0.0.tgz", + "integrity": "sha1-bp1/hRSjRn+l6fgswVjs/B1ax28=", + "requires": { + "optimist": "0.3.7", + "uglify-js": "2.3.6" + }, + "dependencies": { + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "requires": { + "wordwrap": "0.0.3" + } + } + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "requires": { + "ansi-regex": "0.2.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", + "requires": { + "boom": "0.4.2", + "cryptiles": "0.2.2", + "hoek": "0.9.1", + "sntp": "0.2.4" + } + }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=" + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + } + } + }, + "http-errors": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", + "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "setprototypeof": "1.0.2", + "statuses": "1.3.1" + } + }, + "http-proxy": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz", + "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "requires": { + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immutable": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.1.tgz", + "integrity": "sha1-IAgH8Rqw9ycQ6khVQt4IgHX2jNI=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "indx": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" + }, + "inquirer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.7.1.tgz", + "integrity": "sha1-uKzxQBZb1YGGLtEZj7bSZDAJH6w=", + "requires": { + "chalk": "0.5.0", + "cli-color": "0.3.3", + "figures": "1.7.0", + "lodash": "2.4.2", + "mute-stream": "0.0.4", + "readline2": "0.1.1", + "rx": "2.5.3", + "through": "2.3.8" + } + }, + "insight": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.4.3.tgz", + "integrity": "sha1-dtZTxcDYBIsDzbpjhaaUj3RhSvA=", + "requires": { + "async": "0.9.2", + "chalk": "0.5.1", + "configstore": "0.3.2", + "inquirer": "0.6.0", + "lodash.debounce": "2.4.1", + "object-assign": "1.0.0", + "os-name": "1.0.3", + "request": "2.42.0", + "tough-cookie": "0.12.1" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + } + }, + "inquirer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.6.0.tgz", + "integrity": "sha1-YU17s+SPnmqAKOlKDDjyPvKYI9M=", + "requires": { + "chalk": "0.5.1", + "cli-color": "0.3.3", + "lodash": "2.4.2", + "mute-stream": "0.0.4", + "readline2": "0.1.1", + "rx": "2.5.3", + "through": "2.3.8" + } + }, + "object-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-1.0.0.tgz", + "integrity": "sha1-5l3Idm07R7S4MHRlyDEdoDCwcKY=" + }, + "tough-cookie": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", + "integrity": "sha1-giDH4hq9WxPZaAQlS9WoHr8sfWI=", + "requires": { + "punycode": "1.4.1" + } + } + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "intersect": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz", + "integrity": "sha1-waSl5erG7eSvdQTMB+Ctp7yfSSA=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "irregular-plurals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-absolute": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", + "dev": true, + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "3.3.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", + "dev": true, + "requires": { + "is-unc-path": "0.1.2" + } + }, + "is-root": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", + "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-base64": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.3.2.tgz", + "integrity": "sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw==", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jshint": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", + "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", + "dev": true, + "requires": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "3.7.0", + "minimatch": "3.0.4", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + }, + "dependencies": { + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", + "dev": true + } + } + }, + "jshint-stylish": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.2.1.tgz", + "integrity": "sha1-JCCCosA1rgP9gQROBXDMQgjPbmE=", + "dev": true, + "requires": { + "beeper": "1.1.1", + "chalk": "1.1.3", + "log-symbols": "1.0.2", + "plur": "2.1.2", + "string-length": "1.0.1", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "string-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "dev": true, + "requires": { + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + } + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "junk": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", + "integrity": "sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "latest-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-0.2.0.tgz", + "integrity": "sha1-ra+JjV8iOA0/nEU4bv3/ChtbdQE=", + "requires": { + "package-json": "0.2.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "less": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", + "integrity": "sha1-No1sxz4fsDmBGDKAkYdDxdz5s98=", + "dev": true, + "requires": { + "errno": "0.1.4", + "graceful-fs": "4.1.11", + "image-size": "0.5.5", + "mime": "1.2.11", + "mkdirp": "0.5.0", + "promise": "7.3.1", + "request": "2.83.0", + "source-map": "0.5.7" + }, + "dependencies": { + "ajv": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", + "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "optional": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "optional": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true, + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "optional": true, + "requires": { + "ajv": "5.2.3", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "optional": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.0.2" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true, + "optional": true + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", + "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", + "dev": true, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true, + "optional": true + } + } + }, + "liftoff": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", + "dev": true, + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "fined": "1.1.0", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "1.4.0" + } + }, + "limiter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.2.tgz", + "integrity": "sha512-JIKZ0xb6fZZYa3deZ0BgXCgX6HgV8Nx3mFGeFHmFWW8Fb2c08e0CyE+G3nalpD0xGvGssjGb1UdFr+PprxZEbw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "localtunnel": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.8.3.tgz", + "integrity": "sha1-3MWSL9hWUQN9S94k/ZMkjQsk6wU=", + "dev": true, + "requires": { + "debug": "2.6.8", + "openurl": "1.1.1", + "request": "2.81.0", + "yargs": "3.29.0" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "window-size": "0.1.4", + "y18n": "3.2.1" + } + } + } + }, + "lockfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.3.tgz", + "integrity": "sha1-Jjj8OaAzHpysGgS3F5mTHJxQ33k=" + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", + "dev": true, + "requires": { + "lodash._arraycopy": "3.0.0", + "lodash._arrayeach": "3.0.0", + "lodash._baseassign": "3.2.0", + "lodash._basefor": "3.0.3", + "lodash.isarray": "3.0.4", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "dev": true, + "requires": { + "lodash._htmlescapes": "2.4.1" + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=" + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=" + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "dev": true, + "requires": { + "lodash._htmlescapes": "2.4.1", + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + } + } + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1" + } + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-2.4.1.tgz", + "integrity": "sha1-2M6tJG7EuSbouFZ4/Dlr/rqMxvw=", + "requires": { + "lodash.isfunction": "2.4.1", + "lodash.isobject": "2.4.1", + "lodash.now": "2.4.1" + } + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "lodash.isfunction": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", + "integrity": "sha1-LP1XXHPkmKtX4xm3f6Aq3vE6lNE=" + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "requires": { + "lodash._objecttypes": "2.4.1" + } + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", + "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=", + "dev": true + }, + "lodash.now": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.now/-/lodash.now-2.4.1.tgz", + "integrity": "sha1-aHIVZQBSUYX6+WeFu3/n/hW1YsY=", + "requires": { + "lodash._isnative": "2.4.1" + } + }, + "lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "dev": true, + "requires": { + "lodash.keys": "2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" + } + } + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz", + "integrity": "sha1-H92tk4quEmPOE4aAvhs/WRwKtBw=" + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "0.10.35" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "marked": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.6.tgz", + "integrity": "sha1-ssbGGPzOzk74bE/Gy4p8v1rtqNc=", + "dev": true + }, + "marked-terminal": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.7.0.tgz", + "integrity": "sha1-yMRgiBx3LHYEtkNnAH7l938SWQQ=", + "dev": true, + "requires": { + "cardinal": "1.0.0", + "chalk": "1.1.3", + "cli-table": "0.3.1", + "lodash.assign": "4.2.0", + "node-emoji": "1.8.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "cardinal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", + "integrity": "sha1-UOIcGwqjdyn5N33vGWtanOyTLuk=", + "dev": true, + "requires": { + "ansicolors": "0.2.1", + "redeyed": "1.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "esprima": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", + "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "redeyed": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", + "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", + "dev": true, + "requires": { + "esprima": "3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "memoizee": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", + "integrity": "sha1-TsoNiu057J0Bf0xcLy9kMvQuXI8=", + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.35", + "es6-weak-map": "0.1.4", + "event-emitter": "0.3.5", + "lru-queue": "0.1.0", + "next-tick": "0.2.2", + "timers-ext": "0.1.2" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "optional": true + }, + "mime-db": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", + "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=" + }, + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mkpath": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", + "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=" + }, + "mout": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.9.1.tgz", + "integrity": "sha1-hPDz/WrMcxf2PeKv/cwM7gCbBHc=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + }, + "dependencies": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + } + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha1-qSGZYKbV1dBGWXruUSUsZlX3F34=" + }, + "natives": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=" + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "next-tick": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", + "integrity": "sha1-ddpKkn7liH45BliABltzNkE7MQ0=" + }, + "node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "dev": true, + "requires": { + "lodash.toarray": "4.4.0" + } + }, + "node-notifier": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", + "integrity": "sha1-BW0UJE89zBzq3+aK+c/wxUc6M/M=", + "dev": true, + "requires": { + "cli-usage": "0.1.4", + "growly": "1.3.0", + "lodash.clonedeep": "3.0.2", + "minimist": "1.2.0", + "semver": "5.4.1", + "shellwords": "0.1.1", + "which": "1.0.9" + }, + "dependencies": { + "lodash.clonedeep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", + "dev": true, + "requires": { + "lodash._baseclone": "3.3.0", + "lodash._bindcallback": "3.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + } + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" + }, + "node.extend": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, + "requires": { + "is": "3.2.1" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1.0.9" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "2.3.2", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npmconf": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.2.tgz", + "integrity": "sha1-ZmBqSnNvHnegWaoHGnnJSreBhTo=", + "requires": { + "config-chain": "1.1.11", + "inherits": "2.0.3", + "ini": "1.3.4", + "mkdirp": "0.5.0", + "nopt": "3.0.6", + "once": "1.3.3", + "osenv": "0.1.0", + "semver": "2.3.2", + "uid-number": "0.0.5" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz", + "integrity": "sha1-12f1FpMlYg6rLgh+8MRy53PbZGE=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=", + "dev": true + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.0.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz", + "integrity": "sha1-uQlkM0bQChq8l3qLlvPOPFPVz18=" + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + }, + "dependencies": { + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha1-GzefZINa98Wn9JizV8uVIVwVnt8=", + "requires": { + "osx-release": "1.1.0", + "win-release": "1.1.1" + } + }, + "osenv": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.0.tgz", + "integrity": "sha1-YWaBIe7FhJVQMLn0cLHSMJUEv8s=" + }, + "osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha1-8heRGigTaUmvG/kwiyQeJzfTzWw=", + "requires": { + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "p-throttler": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.1.0.tgz", + "integrity": "sha1-GxaQeULDM+bx3eq8s0eSBLjEF8Q=", + "requires": { + "q": "0.9.7" + }, + "dependencies": { + "q": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=" + } + } + }, + "package-json": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-0.2.0.tgz", + "integrity": "sha1-Axbhd7jrFJmF009wa0pVQ7J0vsU=", + "requires": { + "got": "0.3.0", + "registry-url": "0.1.1" + } + }, + "parse-filepath": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", + "dev": true, + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "plexer": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/plexer/-/plexer-0.0.2.tgz", + "integrity": "sha1-Ij1YAGKKBkagCX0wq1doZqLzeE4=", + "dev": true, + "requires": { + "readable-stream": "1.0.34" + } + }, + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "dev": true, + "requires": { + "irregular-plurals": "1.4.0" + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "1.0.8" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.3.2", + "source-map": "0.5.7", + "supports-color": "3.2.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "2.0.6" + } + }, + "promptly": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", + "integrity": "sha1-c+8gD6gynV06jfQXmJULhkbKRtk=", + "requires": { + "read": "1.0.7" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true, + "optional": true + }, + "pump": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/pump/-/pump-0.3.5.tgz", + "integrity": "sha1-rl/4wfk+2HrcZTCpdWWxJvWFRUs=", + "requires": { + "end-of-stream": "1.0.0", + "once": "1.2.0" + }, + "dependencies": { + "once": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.2.0.tgz", + "integrity": "sha1-3hkFxjavh0qPuoYtmqvd0fkgRhw=" + } + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha1-EYcq7t7okmgRCxCnGESP+xARKhQ=" + }, + "qs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "rcfinder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", + "integrity": "sha1-8+gPOH3fmugK4wpBADKWQuroERU=", + "dev": true, + "requires": { + "lodash.clonedeep": "4.5.0" + } + }, + "rcloader": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/rcloader/-/rcloader-0.1.2.tgz", + "integrity": "sha1-oJY6ZDfQnvjLktky0trUl7DRc2w=", + "dev": true, + "requires": { + "lodash": "2.4.2", + "rcfinder": "0.1.9" + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "requires": { + "mute-stream": "0.0.4" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "readline2": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", + "integrity": "sha1-mUQ7pug7gw7zBRv9fcJBqCco1Wg=", + "requires": { + "mute-stream": "0.0.4", + "strip-ansi": "2.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", + "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=" + }, + "strip-ansi": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", + "requires": { + "ansi-regex": "1.1.1" + } + } + } + }, + "recess": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/recess/-/recess-1.1.9.tgz", + "integrity": "sha1-gxxVH0Xfh9SExhI//ekQML7xWBo=", + "dev": true, + "requires": { + "colors": "1.0.3", + "less": "1.3.3", + "nopt": "3.0.6", + "underscore": "1.7.0", + "watch": "1.0.2" + }, + "dependencies": { + "less": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/less/-/less-1.3.3.tgz", + "integrity": "sha1-fujzAKQQgPNUTIDHpwzfamEoDPk=", + "dev": true, + "requires": { + "ycssmin": "1.0.1" + } + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.4.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "redeyed": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "integrity": "sha1-N+mQpvKyGyoRwuakj9QTVpjLqX8=", + "requires": { + "esprima": "1.0.4" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "registry-url": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-0.1.1.tgz", + "integrity": "sha1-FzlCe4GxELMCSCocfNcn/8yC1b4=", + "requires": { + "npmconf": "2.1.2" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.42.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.42.0.tgz", + "integrity": "sha1-VyvQFIk4VkBArHqxSLlkI6BjMEo=", + "requires": { + "aws-sign2": "0.5.0", + "bl": "0.9.5", + "caseless": "0.6.0", + "forever-agent": "0.5.2", + "form-data": "0.1.4", + "hawk": "1.1.1", + "http-signature": "0.10.1", + "json-stringify-safe": "5.0.1", + "mime-types": "1.0.2", + "node-uuid": "1.4.8", + "oauth-sign": "0.4.0", + "qs": "1.2.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "optional": true + }, + "caseless": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", + "integrity": "sha1-gWfBq4OX+1u5X5bSjlqBxQ8kesQ=" + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", + "optional": true, + "requires": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime": "1.2.11" + } + }, + "oauth-sign": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", + "integrity": "sha1-8ilW8x6nFRqCHl8vsywRPK2Ln2k=", + "optional": true + }, + "qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=" + } + } + }, + "request-progress": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.0.tgz", + "integrity": "sha1-vfIGK/wZfF1JJQDUTLOv94ZbSS4=", + "requires": { + "throttleit": "0.0.2" + } + }, + "request-replay": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz", + "integrity": "sha1-m2k6XRGLOfXFlurV7ZGiZEQFf2A=", + "requires": { + "retry": "0.6.0" + } + }, + "require-dir": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/require-dir/-/require-dir-0.3.2.tgz", + "integrity": "sha1-wdXHXp+//eny5rM+OD209ZS1pqk=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "2.2.0", + "minimatch": "3.0.4" + } + }, + "retry": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", + "integrity": "sha1-HAEHEyeab9Ho3vKK8MP/GHHKpTc=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + }, + "run-sequence": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-1.2.2.tgz", + "integrity": "sha1-UJWgvr6YczsBQL0I3YDsAw3azes=", + "dev": true, + "requires": { + "chalk": "0.5.0", + "gulp-util": "3.0.8" + } + }, + "rx": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", + "integrity": "sha1-Ia3H2A8CACr1Da6X/Z2/JIdV9WY=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=" + }, + "semver-diff": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-0.1.0.tgz", + "integrity": "sha1-T2BXyj66I8xIS1H2Sq+IsTGjhV0=", + "requires": { + "semver": "2.3.2" + } + }, + "send": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.15.2.tgz", + "integrity": "sha1-+R+rRAO8+H5xb3DOtdsvV4vcF9Y=", + "dev": true, + "requires": { + "debug": "2.6.4", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.0", + "http-errors": "1.6.2", + "mime": "1.3.4", + "ms": "1.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.4.tgz", + "integrity": "sha1-dYaps8OXQcAoKuM0RcTorHRzT+A=", + "dev": true, + "requires": { + "ms": "0.7.3" + }, + "dependencies": { + "ms": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "dev": true + } + } + }, + "fresh": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", + "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "dev": true + }, + "ms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-1.0.0.tgz", + "integrity": "sha1-Wa3NIu3FQ/e1OBhi0xOHsfS8lHM=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "serve-index": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz", + "integrity": "sha1-fF2WwT+xMRAfk8HFd0+FFqHnjTs=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "batch": "0.5.3", + "debug": "2.2.0", + "escape-html": "1.0.3", + "http-errors": "1.5.1", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + }, + "dependencies": { + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + } + } + }, + "serve-static": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.2.tgz", + "integrity": "sha1-5UbicmCBuBtLzsjpCAjrzdMjr7o=", + "dev": true, + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.15.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", + "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=", + "dev": true + }, + "shell-quote": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.4.3.tgz", + "integrity": "sha1-lSxE4LHtkBPvU5WBecxkPod3Rms=", + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "requires": { + "hoek": "0.9.1" + } + }, + "socket.io": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.6.0.tgz", + "integrity": "sha1-PkDZMmN+a9kjmBslyvfFPoO24uE=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.0", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.6.0", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.6.0.tgz", + "integrity": "sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.0", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": "1.0.1" + } + }, + "source-map-resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", + "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", + "dev": true, + "requires": { + "atob": "1.1.3", + "resolve-url": "0.2.1", + "source-map-url": "0.3.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", + "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=", + "dev": true + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "dev": true + }, + "stream-counter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz", + "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=", + "dev": true + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "2.11.0", + "limiter": "1.1.2" + } + }, + "streamfilter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.5.tgz", + "integrity": "sha1-h1BxEb644phFFxe1Ec/tjwAqv1M=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "string-length": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-0.1.2.tgz", + "integrity": "sha1-qwS7M4Z+50vu1/uJu38InTkngPI=", + "requires": { + "strip-ansi": "0.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.1.0.tgz", + "integrity": "sha1-Vcpg22kAhXxCOukpeYACb5Qe2QM=" + }, + "strip-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.2.2.tgz", + "integrity": "sha1-hU0pDJgVJfyMOXqRCwJa4tVP/Ag=", + "requires": { + "ansi-regex": "0.1.0" + } + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stringify-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-1.0.1.tgz", + "integrity": "sha1-htNefb+86apFY31+zdeEfhWduKI=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "requires": { + "ansi-regex": "0.2.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "dev": true, + "requires": { + "first-chunk-stream": "2.0.0", + "strip-bom": "2.0.0" + }, + "dependencies": { + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=" + }, + "tar-fs": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-0.5.2.tgz", + "integrity": "sha1-D1lCS+fu7kUjIxbjAvZtP26m2z4=", + "requires": { + "mkdirp": "0.5.0", + "pump": "0.3.5", + "tar-stream": "0.4.7" + } + }, + "tar-stream": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-0.4.7.tgz", + "integrity": "sha1-Hx0s6evHtCdlJDyg6PG3v9oKrc0=", + "requires": { + "bl": "0.9.5", + "end-of-stream": "1.0.0", + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "tfunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz", + "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "object-path": "0.9.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timers-ext": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.2.tgz", + "integrity": "sha1-YcxHp2wavTGV8UUn+XjViulMUgQ=", + "requires": { + "es5-ext": "0.10.35", + "next-tick": "1.0.0" + }, + "dependencies": { + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + } + } + }, + "tmp": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz", + "integrity": "sha1-3odKpel0qF8KMs39vXRmPLO9nHQ=" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "touch": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", + "integrity": "sha1-plp3d5Xly74SmUmb3EIoH/shtfQ=", + "requires": { + "nopt": "1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1.0.9" + } + } + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "requires": { + "punycode": "1.4.1" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "ua-parser-js": { + "version": "0.7.12", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz", + "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs=", + "dev": true + }, + "uglify-js": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", + "optional": true, + "requires": { + "async": "0.2.10", + "optimist": "0.3.7", + "source-map": "0.1.43" + }, + "dependencies": { + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "optional": true, + "requires": { + "wordwrap": "0.0.3" + } + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "integrity": "sha1-lXJsF8xv0XHDYX479NjYKqjEzOE=", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "uid-number": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz", + "integrity": "sha1-Wj2yPvXb1VuB/ODsmirG/M3ruB4=" + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "update-notifier": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.2.0.tgz", + "integrity": "sha1-oBDJKK3PAgkLjgzn/vb7Cnysw0o=", + "requires": { + "chalk": "0.5.0", + "configstore": "0.3.2", + "latest-version": "0.2.0", + "semver-diff": "0.1.0", + "string-length": "0.1.2" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-bufferstream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vinyl-bufferstream/-/vinyl-bufferstream-1.0.1.tgz", + "integrity": "sha1-BTeGn1gO/6TKRay0dXnkuf5jCBo=", + "dev": true, + "requires": { + "bufferstreams": "1.0.1" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0", + "strip-bom-stream": "2.0.0", + "vinyl": "1.2.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.0", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-source-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz", + "integrity": "sha1-RMvlEIIFJ53rDFZTwJSiiHk4sas=", + "dev": true, + "requires": { + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "watch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz", + "integrity": "sha1-NApxe952Vyb6CqB9ch4BR6VR3ww=", + "dev": true, + "requires": { + "exec-sh": "0.2.1", + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "weinre": { + "version": "2.0.0-pre-I0Z7U9OV", + "resolved": "https://registry.npmjs.org/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz", + "integrity": "sha1-/viqIjkh97QLu71MPtQwL2/QqBM=", + "dev": true, + "requires": { + "express": "2.5.11", + "nopt": "3.0.6", + "underscore": "1.7.0" + } + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=" + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", + "requires": { + "semver": "5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + } + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", + "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xdg-basedir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz", + "integrity": "sha1-FP+PY6T9vLBdW27qIrNvMDO58E4=", + "requires": { + "user-home": "1.1.1" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz", + "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "ycssmin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ycssmin/-/ycssmin-1.0.1.tgz", + "integrity": "sha1-fN3o23jPqwDSkBw7IwHjBPr03xY=", + "dev": true, + "optional": true + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 4a20379fff..aaae3b009b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "description": "SendGrid's Documentation", "main": "public/index.html", "dependencies": { - "bower": "~1.3.1" + "bower": "~1.3.1", + "debug": "^3.1.0", + "markdown-spellcheck": "^1.0.0" }, "devDependencies": { "browser-sync": "^2.9.11", @@ -33,7 +35,9 @@ "vinyl-source-stream": "^1.1.0" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "npm run spellcheck || :", + "spellcheck": "echo \"Spellchecking...\" && mdspell '**/*.html' '**/*.md' '!**/node_modules/**/*' '!**/public/**/*' '!**/linklint_logs/**/*' -a --en-us -r || :", + "spellcheck-file": "mdspell -a --en-us -r" }, "repository": { "type": "git", diff --git a/plugins/date.rb b/plugins/date.rb index b864f3e956..49fb79a360 100644 --- a/plugins/date.rb +++ b/plugins/date.rb @@ -95,4 +95,4 @@ def initialize(site, base, dir, name) self.data['updated_formatted'] = format_date(self.data['updated'], date_format) if self.data.has_key?('updated') end end -end \ No newline at end of file +end diff --git a/plugins/include_array.rb b/plugins/include_array.rb index 000040fb0e..042d03073b 100644 --- a/plugins/include_array.rb +++ b/plugins/include_array.rb @@ -1,6 +1,6 @@ # Title: Include Array Tag for Jekyll # Author: Jason Woodward http://www.woodwardjd.com -# Description: Import files on your filesystem as specified in a configuration variable in _config.yml. Mostly cribbed from Jekyll's include tag. +# Description: Import files on your filesystem as specified in a configuration variable in _config.yml. Mostly cribbed from Jekyll's include tag. # Syntax: {% include_array variable_name_from_config.yml %} # # Example 1: diff --git a/plugins/jsfiddle.rb b/plugins/jsfiddle.rb index 3ae173ebeb..a80becb332 100644 --- a/plugins/jsfiddle.rb +++ b/plugins/jsfiddle.rb @@ -37,4 +37,4 @@ def render(context) end end -Liquid::Template.register_tag('jsfiddle', Jekyll::JsFiddle) \ No newline at end of file +Liquid::Template.register_tag('jsfiddle', Jekyll::JsFiddle) diff --git a/plugins/pageless_redirects.rb b/plugins/pageless_redirects.rb index 2ab701e586..2b799e51be 100755 --- a/plugins/pageless_redirects.rb +++ b/plugins/pageless_redirects.rb @@ -49,6 +49,7 @@ # Plugin License: MIT # Plugin Credit: This plugin borrows heavily from alias_generator (http://github.com/tsmango/jekyll_alias_generator) by Thomas Mango (http://thomasmango.com) +require 'uri' require 'json' module Jekyll @@ -107,6 +108,8 @@ def generate_aliases(destination_path, aliases) alias_paths.flatten.each do |alias_path| alias_path = alias_path.to_s + register(alias_path, destination_path) + alias_dir = File.extname(alias_path).empty? ? alias_path : File.dirname(alias_path) alias_file = File.extname(alias_path).empty? ? "index.html" : File.basename(alias_path) @@ -126,6 +129,44 @@ def generate_aliases(destination_path, aliases) end end + def register(alias_href, destination_href) + @known_aliases ||= {} + @known_destinations ||= {} + + alias_url = url(alias_href) + destination_url = url(destination_href) + + if exisiting_destination_href = @known_aliases[alias_url] + if exisiting_destination_href == destination_href + puts "WARNING: #{alias_href} -> #{destination_href} already exists" + else + raise "Can't have duplicate redirections: " \ + "You're trying to create #{alias_href} -> #{destination_href} but " \ + "#{alias_href} -> #{exisiting_destination_href} already exists" + end + end + + if exisiting_alias_href = @known_destinations[alias_url] + raise "Can't chain redirections: " \ + "You're trying to create #{alias_href} -> #{destination_href} but " \ + "#{exisiting_alias_href} -> #{alias_href} exists" + end + + if exisiting_destination_href = @known_aliases[destination_url] + raise "Can't chain redirections: " \ + "You're trying to create #{alias_href} -> #{destination_href} but " \ + "#{destination_href} -> #{exisiting_destination_href} exists" + end + + @known_aliases[alias_url] = destination_href + @known_destinations[destination_url] = alias_href + end + + def url(href) + @base_uri ||= URI(@site.config["url"]).tap { |uri| uri.path = "" } + URI(href).scheme.nil? ? "#{@base_uri}#{href}" : href + end + def alias_template(destination_path) <<-EOF <!DOCTYPE html> @@ -149,7 +190,6 @@ def alias_template(destination_path) end class PagelessRedirectFile < StaticFile - require 'set' def destination(dest) File.join(dest, @dir) diff --git a/plugins/preview_unpublished.rb b/plugins/preview_unpublished.rb index 321ffd6f5d..28cbdfe79d 100644 --- a/plugins/preview_unpublished.rb +++ b/plugins/preview_unpublished.rb @@ -45,4 +45,4 @@ def read_posts(dir) self.posts = self.posts[-limit_posts, limit_posts] if limit_posts end end -end \ No newline at end of file +end diff --git a/plugins/rubypants.rb b/plugins/rubypants.rb index e4f4502f57..3d0b60cd37 100644 --- a/plugins/rubypants.rb +++ b/plugins/rubypants.rb @@ -56,10 +56,10 @@ # to force non-smart punctuation. It does so by transforming the # escape sequence into a decimal-encoded HTML entity: # -# \\ \" \' \. \- \` +# \\ \" \' \. \- \` # # This is useful, for example, when you want to use straight quotes as -# foot and inch marks: 6'2" tall; a 17" iMac. (Use <tt>6\'2\"</tt> +# foot and inch marks: 6'2" tall; a 17" iMac. (Use <tt>6\'2\"</tt> # resp. <tt>17\"</tt>.) # # @@ -329,7 +329,7 @@ def to_html # or other character to appear. # # Escaped are: - # \\ \" \' \. \- \` + # \\ \" \' \. \- \` # def process_escapes(str) str.gsub('\\\\', '\'). @@ -360,7 +360,7 @@ def educate_dashes_oldschool(str) # an en-dash HTML entity. Two reasons why: First, unlike the en- and # em-dash syntax supported by +educate_dashes_oldschool+, it's # compatible with existing entries written before SmartyPants 1.1, - # back when "<tt>--</tt>" was only used for em-dashes. Second, + # back when "<tt>--</tt>" was only used for em-dashes. Second, # em-dashes are more common than en-dashes, and so it sort of makes # sense that the shortcut should be shorter to type. (Thanks to # Aaron Swartz for the idea.) @@ -443,14 +443,14 @@ def educate_quotes(str) # def stupefy_entities(str) str. - gsub(/–/, '-'). # en-dash - gsub(/—/, '--'). # em-dash + gsub(/–/, '-'). # en-dash + gsub(/—/, '--'). # em-dash - gsub(/‘/, "'"). # open single quote - gsub(/’/, "'"). # close single quote + gsub(/‘/, "'"). # open single quote + gsub(/’/, "'"). # close single quote - gsub(/“/, '"'). # open double quote - gsub(/”/, '"'). # close double quote + gsub(/“/, '"'). # open double quote + gsub(/”/, '"'). # close double quote gsub(/…/, '...') # ellipsis end @@ -462,7 +462,7 @@ def stupefy_entities(str) # is either :tag or :text; the second is the actual value. # # Based on the <tt>_tokenize()</tt> subroutine from Brad Choate's - # MTRegex plugin. <http://www.bradchoate.com/past/mtregex.php> + # MTRegex plugin. <http://www.bradchoate.com/past/mtregex.php> # # This is actually the easier variant using tag_soup, as used by # Chad Miller in the Python port of SmartyPants. diff --git a/source/API_Reference/Event_Webhook/event.md b/source/API_Reference/Event_Webhook/event.md new file mode 100644 index 0000000000..5e4a260fc7 --- /dev/null +++ b/source/API_Reference/Event_Webhook/event.md @@ -0,0 +1,1041 @@ +--- +seo: + title: Event Webhook Reference + description: Full Event Webhook event list and descriptions, event examples, and the objects each event contains. + keywords: event webhook API reference, reference, events, event webhook +title: Event Webhook Reference +weight: 90 +layout: page +navigation: + show: true +--- + +- [Events](#-Events) +- [Example Response](#-Example-response) +- [Delivery events](#-Delivery-events) + - [Processed](#processed) + - [Dropped](#dropped) + - [Delivered](#delivered) + - [Deferred](#deferred) + - [Bounce](#bounce) +- [Engagement events](#-Engangement-events) + - [Open](#open) + - [Click](#click) + - [Spam Report](#spamreport) + - [Unsubscribe](#unsubscribe) + - [Group Unsubscribe](#groupunsubscribe) + - [Group Resubscribe](#groupresubscribe) +- [Event JSON objects](#-Event-JSON-objects) + - [email](#email) + - [timestamp](#timestamp) + - [event](#event) + - [smtp-id](#smtpid) + - [useragent](#useragent) + - [IP](#ip) + - [sg_event_id](#sgeventid) + - [sg_message_id](#sgmessageid) + - [reason](#reason) + - [status](#status) + - [response](#response) + - [tls](#tls) + - [url](#url) + - [attempt](#attempt) + - [category](#category) + - [asm_group_id](#asmgroupid) + - [unique_args or custom_args](#uniqueargs) + - [marketing_campaign_id](#marketingcampaignid) + - [marketing_campaign_name](#marketingcampaignname) + +{% anchor h2 %} +Events +{% endanchor %} + +Events are generated when email is processed by SendGrid and email service providers. There are two types of events - delivery and engagement events. Delivery events indicate the status of email delivery to the recipient. Engagement events indicate how the recipient is interacting with the email. + +Here is a flow of email events: + +![event flow]({{root_url}}/images/email_event_flow.jpg "Event Flow") + +Here is an event response that includes an example of each type of event: + +{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"processed", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"deferred", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id", + "response":"400 try again later", + "attempt":"5" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"delivered", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id", + "response":"250 OK" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "event":"open", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id", + "useragent":"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", + "ip":"255.255.255.255" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "event":"click", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id", + "useragent":"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", + "ip":"255.255.255.255", + "url":"http://www.sendgrid.com/" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"bounce", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id", + "reason":"500 unknown recipient", + "status":"5.0.0" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"dropped", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id", + "reason":"Bounced Address", + "status":"5.0.0" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"spamreport", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"unsubscribe", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id" + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"group_unsubscribe", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id", + "useragent":"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", + "ip":"255.255.255.255", + "url":"http://www.sendgrid.com/", + "asm_group_id":10 + }, + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"group_resubscribe", + "category":"cat facts", + "sg_event_id":"sg_event_id", + "sg_message_id":"sg_message_id", + "useragent":"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", + "ip":"000.000.000.000", + "url":"http://www.sendgrid.com/", + "asm_group_id":10 + } +] +{% endcodeblock %} + +{% anchor h3 %} +Delivery events +{% endanchor %} + + +Delivery events include processed, dropped, delivered, deferred, and bounce. + +<table class="table"> + <tbody> + <tr> + <th>Event</th> + <th>Description</th> + <th>Example webhook response</th> + </tr> + <tr> + <td><a name="processed"></a>Processed</td> + <td>Message has been received and is ready to be delivered.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "pool": { + "name": "new_MY_test", + "id": 210 + }, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"processed", + "category":"cat facts", + "sg_event_id":"rbtnWrG1DVDGGGFHFyun0A==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0" + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="dropped"></a>Dropped</td> + <td>You may see the following drop reasons: Invalid SMTPAPI header, Spam Content (if Spam Checker app is enabled), Unsubscribed Address, Bounced Address, Spam Reporting Address, Invalid, Recipient List over Package Quota</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"dropped", + "category":"cat facts", + "sg_event_id":"zmzJhfJgAfUSOW80yEbPyw==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0", + "reason":"Bounced Address", + "status":"5.0.0" + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="delivered"></a>Delivered</td> + <td>Message has been successfully delivered to the receiving server.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"delivered", + "category":"cat facts", + "sg_event_id":"rWVYmVk90MjZJ9iohOBa3w==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0", + "response":"250 OK" + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="deferred"></a>Deferred</td> + <td>Receiving server temporarily rejected the message.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"deferred", + "category":"cat facts", + "sg_event_id":"t7LEShmowp86DTdUW8M-GQ==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0", + "response":"400 try again later", + "attempt":"5" + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="bounce"></a>Bounce</td> + <td>Receiving server could not or would not accept the message. If a recipient has previously unsubscribed from your emails, the message is bounced.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"bounce", + "category":"cat facts", + "sg_event_id":"6g4ZI7SA-xmRDv57GoPIPw==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0", + "reason":"500 unknown recipient", + "status":"5.0.0" + } +] +{% endcodeblock %}</td> + </tr> + </tbody> +</table> + +{% anchor h3 %} +Engagement events +{% endanchor %} + +Engagement events include open, click, spam report, unsubscribe, group unsubscribe, and group resubscribe. + +<table class="table"> + <tbody> + <tr> + <th>Event</th> + <th>Description</th> + <th>Example webhook response</th> + </tr> + <tr> + <td><a name="open"></a>Open</td> + <td>Recipient has opened the HTML message. Open Tracking needs to be enabled for this type of event.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "event":"open", + "category":"cat facts", + "sg_event_id":"FOTFFO0ecsBE-zxFXfs6WA==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0", + "useragent":"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", + "ip":"255.255.255.255" + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="click"></a>Click</td> + <td>Recipient clicked on a link within the message. Click Tracking needs to be enabled for this type of event.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "event":"click", + "category":"cat facts", + "sg_event_id":"kCAi1KttyQdEKHhdC-nuEA==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0", + "useragent":"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", + "ip":"255.255.255.255", + "url":"http://www.sendgrid.com/" + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="spamreport"></a>Spam Report</td> + <td>Recipient marked message as spam.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"spamreport", + "category":"cat facts", + "sg_event_id":"37nvH5QBz858KGVYCM4uOA==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0" + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="unsubscribe"></a>Unsubscribe</td> + <td>Recipient clicked on the 'Opt Out of All Emails' link (available after clicking the message's subscription management link). Subscription Tracking needs to be enabled for this type of event.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"unsubscribe", + "category":"cat facts", + "sg_event_id":"zz_BjPgU_5pS-J8vlfB1sg==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0" + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="groupunsubscribe"></a>Group Unsubscribe</td> + <td>Recipient unsubscribed from a specific group either by clicking the link directly or updating their preferences. Subscription Tracking needs to be enabled for this type of event.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"group_unsubscribe", + "category":"cat facts", + "sg_event_id":"ahSCB7xYcXFb-hEaawsPRw==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0", + "useragent":"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", + "ip":"255.255.255.255", + "url":"http://www.sendgrid.com/", + "asm_group_id":10 + } +] +{% endcodeblock %}</td> + </tr> + <tr> + <td><a name="groupresubscribe"></a>Group Resubscribe</td> + <td>Recipient resubscribed to a specific group by updating their preferences. Subscription Tracking needs to be enabled for this type of event.</td> + <td>{% codeblock lang:json %} +[ + { + "email":"example@test.com", + "timestamp":1513299569, + "smtp-id":"<14c5d75ce93.dfd.64b469@ismtpd-555>", + "event":"group_resubscribe", + "category":"cat facts", + "sg_event_id":"w_u0vJhLT-OFfprar5N93g==", + "sg_message_id":"14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0", + "useragent":"Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", + "ip":"255.255.255.255", + "url":"http://www.sendgrid.com/", + "asm_group_id":10 + } +] +{% endcodeblock %}</td> + </tr> + </tbody> +</table> + +{% anchor h2 %} +Event objects +{% endanchor %} + +<table class="table"> + <tr> + <th></th> + <th><a href="#processed">Processed</a></th> + <th><a href="#dropped">Dropped</a></th> + <th><a href="#delivered">Delivered</a></th> + <th><a href="#deferred">Deferred</a></th> + <th><a href="#bounce">Bounce</a></th> + <th><a href="#opened">Opened</a></th> + <th><a href="#clicked">Clicked</a></th> + <th><a href="#spamreport">Spam Report</a></th> + <th><a href="#unsubscribe">Unsubscribe</a></th> + <th><a href="#groupunsubscribe">Group Unsubscribe</a></th> + <th><a href="#groupresubscribe"Group Resubscribe</a></th> + </tr> + <tr> + <td><a href="#email">email</a></td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#timestamp">timestamp</a></td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#event">event</a></td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#smtpid">smtp-id</a></td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td></td> + <td></td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#useragent">useragent</a></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td>X</td> + <td>X</td> + <td></td> + <td></td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#ip">ip</a></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td>X</td> + <td>X</td> + <td></td> + <td></td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#sgeventid">sg_event_id</a></td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#sgmessageid">sg_message_id</a></td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#reason">reason</a></td> + <td></td> + <td>X</td> + <td></td> + <td></td> + <td>X</td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><a href="#status">status</a></td> + <td></td> + <td>X</td> + <td></td> + <td></td> + <td>X</td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><a href="#response">response</a></td> + <td></td> + <td></td> + <td>X</td> + <td>X</td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><a href="#tls">tls</a></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><a href="#url">url</a></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td>X</td> + <td></td> + <td></td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#category">category</a></td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#asmgroupid">asm_group_id</a></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td>X</td> + <td>X</td> + </tr> + <tr> + <td><a href="#uniqueargs">unique_args</a></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><a href="#marketingcampaignid">marketing_campaign_id</a></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><a href="#marketingcampaignname">marketing_campaign_name</a></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><a href="#attempt">attempt</a></td> + <td></td> + <td></td> + <td></td> + <td>X</td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + <tr> + <td><a href="#pool">pool</a></td> + <td>X</td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> +</table> + +{% anchor h3 %} +JSON objects +{% endanchor %} + +- <a name="email"></a>`email` - the email address of the recipient +- <a name="timestamp"></a>`timestamp` - the <a href="https://en.wikipedia.org/wiki/Unix_time">UNIX timestamp</a> of when the message was sent +- <a name="event"></a>`event` - the event type. Possible values are processed, dropped, delivered, deferred, bounce, open, click, spam report, unsubscribe, group unsubscribe, and group resubscribe. +- <a name="smtpid"></a>`smtp-id` - a unique ID attached to the message by the originating system. +- <a name="useragent"></a>`useragent` - the user agent responsible for the event. This is usually a web browser. For example, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36". +- <a name="ip"></a>`IP` - the IP address used to send the email. For `open` and `click` events, it is the IP address of the recipient who engaged with the email. +- <a name="sgeventid"></a>`sg_event_id` - a unique ID to this event that you can use for deduplication purposes. These IDs are either 22 or 48 characters long. +- <a name="sgmessageid"></a>`sg_message_id` - a unique, internal SendGrid ID for the message. The first half of this is pulled from the `smtp-id`. +- <a name="reason"></a>`reason` - any sort of error response returned by the receiving server that describes the reason this event type was triggered. +- <a name="status"></a>`status` - status code string. Corresponds to HTTP status code - for example, a JSON response of 5.0.0 is the same as a 500 error response. +- <a name="response"></a>`response` - the full text of the HTTP response error returned from the receiving server. +- <a name="tls"></a>`tls` - indicates whether TLS encription was used in sending this message. For more information about TLS, see the [TLS Glossary page]({{root_url}}/Glossary/tls.html). +- <a name="url"></a>`url` - the URL where the event originates. For click events, this is the URL clicked on by the recipient. +- <a name="attempt"></a>`attempt` - the number of times SendGrid has attempted to deliver this message. +- <a name="category"></a>`category` - [Categories]({{root_url}}/Glossary/categories.html) are custom tags that you set for the purpose of organizing your emails. If you send single categories as an array, they will be returned by the webhook as an array. If you send single categories as a string, they will be returned by the webhook as a string. + +String categories: + +{% codeblock lang:json %} +[ + { + "email": "john.doe@sendgrid.com", + "timestamp": 1337966815, + "category": "newuser", + "event": "open" + }, + { + "email": "jane.doe@sendgrid.com", + "timestamp": 1337966815, + "category": "olduser", + "event": "open" + } +] +{% endcodeblock %} + +Array: + +{% codeblock lang:json %} +[ + { + "email": "john.doe@sendgrid.com", + "timestamp": 1337966815, + "category": [ + "newuser", + "transactional" + ], + "event": "open" + }, + { + "email": "jane.doe@sendgrid.com", + "timestamp": 1337966815, + "category": "olduser", + "event": "open" + } +] +{% endcodeblock %} + +- <a name="asmgroupid"></a>`asm_group_id` - The ID of the unsubscribe group the recipient's email address is included in. ASM IDs correspond to the ID that is returned when you create an unsubscribe group. +- <a name="uniqueargs"></a>`unique_args` or `custom_args` +{% anchor h2 %} +Unique Arguments and Custom Arguments +{% endanchor %} + +Events generated by SendGrid can include [unique arguments]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html) or custom arguments. + +{% info %} +Unique arguments and custom arguments essentially have the same function. However, unique arguments are used in the SMTP API or V2 Mail Send, and custom arguments are used in the V3 Mail Send. +{% endinfo %} + +{% anchor h3 %} +Unique Arguments +{% endanchor %} + +To define and receive unique arguments when sending email with the [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html) or the [v2 Mail Send endpoint]({{root_url}}/API_Reference/Web_API/mail.html), use the `unique_args` parameter in the X-SMTPAPI header. For example, if you have an application and want to receive custom parameters such as the `userid` and the email `template`, you would submit them with the X-SMTPAPI header, as described [here]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html). + +For example, if you include the following unique arguments in your x-smtpapi header for an email sent via the v2 Mail Send endpoint: + +{% codeblock lang:json %} +{ + "unique_args": { + "userid": "1123", + "template": "welcome" + } +} +{% endcodeblock %} + +You will receive the same unique argument included with the data posted to your Event Webhook: + +{% codeblock lang:json %} +[ + { + "sg_message_id":"sendgrid_internal_message_id", + "email": "john.doe@sendgrid.com", + "timestamp": 1337966815, + "event": "click", + "url": "https://sendgrid.com", + "userid": "1123", + "template": "welcome" + } +] +{% endcodeblock %} + +{% warning %} +You can create unique arguments with the same words as reserved keys, such as "event" or "email". However, SendGrid will default to the reserved key and NOT your unique argument for events that contain a reserved key as an object. An example of this is below. +{% endwarning %} + +{% anchor h4 %} +Reserved Keys in Unique Arguments +{% endanchor %} + +{% codeblock lang:json %} +//for this example, assume we're sending to john.doe@sendgrid.com +{ + "unique_args": { + "customerAccountNumber": "55555", + "activationAttempt": "1", + "New Argument 1": "New Value 1", + "email": "jane.doe@sendgrid.com", + "event": "SendEmail" + } +} +{% endcodeblock %} + +{% anchor h4 %} +The resulting webhook call +{% endanchor %} + +{% codeblock lang:json %} +[ + { + "event": "Processed", + "timestamp":"123456789", + "customerAccountNumber": "55555", + "activationAttempt": "1", + "New Argument 1": "New Value 1", + "email": "john.doe@sendgrid.com" + } +] +{% endcodeblock %} + +{% info %} +You'll notice that the unique arguments, "event" and "email", were overwritten because they are reserved keys for SendGrid's values. +{% endinfo %} + +{% anchor h3 %} +Custom Arguments +{% endanchor %} + +Any custom arguments that you include with an email sent through [v3 Mail Send]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html) gets added to your Event Webhook response. + +For example, if you were to include the following custom arguments in a personalization in your payload to the v3 Mail Send endpoint: + +{% codeblock lang:json %} +{ + "personalizations": [ + { + "to": [ + { + "email": "example@example.com" + } + ], + "subject": "Hello, World!", + "custom_args": { + "userid": "1123" + } + } + ], + "from": { + "email": "from_address@example.com" + }, + "content": [ + { + "type": "text/plain", + "value": "Hello, World!" + } + ] +} +{% endcodeblock %} + +The Event Webhook response: + +{% codeblock lang:json %} +[ + { + "userid": "1123" + } +] +{% endcodeblock %} + +- <a name="marketingcampaignid"></a>`marketing_campaign_id` +- <a name="marketingcampaignname"></a>`marketing_campaign_name` + +For emails sent through our Marketing Campaigns feature, we add Marketing Campaigns specific parameters to the Event Webhook. Both `marketing_campaign_name` and `marketing_campaign_id` are displayed as unique arguments in the event data. + +{% anchor h3 %} +Example event from a standard (non-A/B test) campaign send: + {% endanchor %} + +{% codeblock lang:json %} + { + "category": [], + "email": "email@example.com", + "event": "processed", + "marketing_campaign_id": 12345, + "marketing_campaign_name": "campaign name", + "post_type": "event", + "sg_event_id": "sendgrid_internal_event_id", + "sg_message_id": "sendgrid_internal_message_id", + "sg_user_id": 12345, + "smtp-id": "", + "timestamp": 1442349428 + } +{% endcodeblock %} + +{% anchor h3 %} +Example event from an A/B Test: +{% endanchor %} + + `marketing_campaign_version` is displayed in the event data for emails sent as part of an A/B Test. The value for `marketing_campaign_version` are returned as `A`, `B`, `C`, etc. + +{% codeblock lang:json %} +{ + "category": [], + "email": "tadpole_0010@stbase-018.sjc1.sendgrid.net", + "event": "processed", + "marketing_campaign_id": 23314, + "marketing_campaign_name": "unique args ab", + "marketing_campaign_version": "B", + "marketing_campaign_split_id": 13471, + "post_type": "event", + "sg_event_id": "qNOzbkTuTNCdxa1eXEpnXg", + "sg_message_id": "5lFl7Fr1Rjme_EyzNNB_5A.stfilter-015.5185.55F883172.0", + "sg_user_id": 939115, + "smtp-id": "<5lFl7Fr1Rjme_EyzNNB_5A@stismtpd-006.sjc1.sendgrid.net>", + "timestamp": 1442349848 +} +{% endcodeblock %} + +{% anchor h3 %} +Example event from the winning phase of an A/B Test: +{% endanchor %} + +{% codeblock lang:json %} +{ + "category": [], + "email": "tadpole_0001@stbase-018.sjc1.sendgrid.net", + "event": "delivered", + "marketing_campaign_id": 23314, + "marketing_campaign_name": "unique args ab", + "post_type": "event", + "response": "250 Ok ", + "sg_event_id": "X2M1IUfMRhuAhWM0CbmFqQ", + "sg_message_id": "fPJrJPIRTxC_obpgfTy74w.stfilter-015.5185.55F883564.0", + "sg_user_id": 12345, + "smtp-id": "", + "timestamp": 1442349911 +} +{% endcodeblock %} + +{% anchor h3 %} +Legacy Marketing Email Unsubscribes +{% endanchor %} + +For emails sent through our Legacy Marketing Email tool, unsubscribes look like the following example: + +{% codeblock lang:json %} +[ + { + "email": "nick@sendgrid.com", + "timestamp": 1380822437, + "newsletter": { + "newsletter_user_list_id": "10557865", + "newsletter_id": "1943530", + "newsletter_send_id": "2308608" + }, + "category": [ + "Tests", + "Newsletter" + ], + "event": "unsubscribe" + } +] +{% endcodeblock %} + +<a name="pool"></a>`pool` - For emails sent with a specified IP Pool, you can view the IP Pool in the event data for a processed event. + +{% codeblock lang:json %} +[ + { + "email": "john.doe@sendgrid.com", + "smtp-id": "<14c583da911.2c36.1c804d@ismtpd-073>", + "timestamp": 1427409578, + "pool": { + "name": "new_MY_test", + "id": 210 + }, + "sg_event_id": "RHFZB1IrTD2Y9Q7bUdZxUw", + "sg_message_id": "14c583da911.2c36.1c804d.filter-406.22375.55148AA99.0", + "event": "processed" + } +] +{% endcodeblock %} + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Getting started with the Event Webhook]({{root_url}}/API_Reference/Event_Webhook/getting_started_event_webhook.html) +- [Troubleshooting the event webhook]({{root_url}}/API_Reference/Event_Webhook/troubleshooting.html) +- [An Event Webhook case study](https://sendgrid.com/blog/leveraging-sendgrids-event-api/) +- [Webhook web libraries]({{root_url}}/Integrate/libraries.html#-Webhook-Libraries) +- [Getting started with Keen.io]({{root_url}}/Integrate/Tutorials/analytics_with_keen_io.html) diff --git a/source/API_Reference/Event_Webhook/getting_started_event_webhook.md b/source/API_Reference/Event_Webhook/getting_started_event_webhook.md new file mode 100644 index 0000000000..ccd22aefe4 --- /dev/null +++ b/source/API_Reference/Event_Webhook/getting_started_event_webhook.md @@ -0,0 +1,94 @@ +--- +seo: + title: Getting Started + description: Use RequestBin to get started or to troubleshoot your Event Webhook. + keywords: webhook, RequestBin, troubleshoot, event webhook +title: Getting Started +weight: 100 +layout: page +navigation: + show: true +--- + +- [Getting started](#-Getting-started) +- [Next steps](#-Next-steps) + - [Data storage](#-Data-storage) + - [Integrating](#-Integrating) + +SendGrid's Event Webhook will notify a URL of your choice via HTTP POST with information about events that occur as SendGrid processes your email. You can use this data to remove unsubscribes, react to spam reports, [determine unengaged recipients]({{site.blog_url}}/infer-engagement-with-the-event-api/), identify bounced email addresses, or create advanced analytics of your email program. With Unique Arguments and Category parameters, you can insert dynamic data that will help build a sharp, clear image of your mailings. + +You should set up the Event Webhook if you want to keep track of more event data than we store for you. Due to the sheer volume of email we send, we can only store so much information. Your [Email Activity Feed]({{root_url}}/User_Guide/email_activity_feed.html) can hold up to 30 days worth of events. After that time passes, the email event data is gone. + +{% anchor h2 %} +Getting started +{% endanchor %} + +*To get started with the Event Webhook:* + +1. Go to the [Webhook tester](https://webhook.site/). +1. Copy the unique URL. +1. In a new window, open [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) in the [SendGrid UI](https://app.sendgrid.com). +1. Turn on **Event Notification**. +1. In the **HTTP POST URL field**, paste the unique URL that you copied in step 2. +1. Select the Event notifications you would like to test. +1. Click the checkmark in the top corner to save these updates into your settings. +1. Click **Test Your Integration**. + <br> This returns an HTTP POST containing a JSON array of your selected events in one request after a very short delay. Our servers send these POSTs to the URL you defined in the Event Notification app options. +1. Go back to the [Webhook tester](https://webhook.site/) and reload the page. + <br> This loads the JSON array of your selected events that you set in the last step. + +{% warning %} +The Webhook tester site has a public URL. This is usually safe for testing purposes, just make sure that you remove the `webhook.site` URL from your Event Notifications settings after you are done testing. +{% endwarning %} + +{% info %} +You can also update your Event Webhook mail settings using the [PATCH /user/webhooks/event/settings](https://sendgrid.api-docs.io/v3.0/webhooks/update-event-notification-settings) API method, and you can test the webhook integration using the [POST /user/webhooks/event/test](https://sendgrid.api-docs.io/v3.0/webhooks/test-event-notification-settings) API method. +{% endinfo %} + +{% info %} +If you want to test your webhook locally, deploy a local version of [Webhook tester](https://github.com/fredsted/webhook.site), or [RequestBin](https://github.com/Runscope/requestbin#readme). Other browser options are [Beeceptor](https://beeceptor.com), or [ngrok](https://ngrok.com/). +{% endinfo %} + +{% anchor h2 %} +Next steps +{% endanchor %} + +Now that you understand what Event data looks like and the basics of the webhook, it's time to evaluate your own needs for the types of events you want to store, what kind of data storage that requires, and then switch your integration from the RequestBin test to a more permanent integration. + +{% anchor h3 %} +Data Storage +{% endanchor %} + +Events post every 30 seconds or when the batch size reaches 768 kilobytes - whichever occurs first. This is per server, so if you send a high volume of emails, the webhook URL may receive tens or even hundreds of posts per second. Because of this, storage should be a significant consideration of the type of integration you set up. + +Storage integrations are infinitely flexible, but here are some popular options: + +- Locally on your servers. +- SendGrid's [open source Event Kit](https://github.com/sendgrid/eventkit-rails) stores the data on a Heroku instance. +- SendGrid's partner, Keen.io provides a platform to analyze, visualize, and store SendGrid Event data. For more information about getting started with Keen IO, see the [Keen.io Getting Started page](https://sendgrid.com/docs/Integrate/Tutorials/analytics_with_keen_io.html). +- You could also use [Snowplow](https://github.com/snowplow/snowplow/wiki/SendGrid-webhook-setup), a web open source platform that supports SendGrid and stores the data on Amazon Redshift. +- Several open source web libraries support SendGrid's Event Webhook. For a full list of these libraries, see the [Webhook libraries section]({{root_url}}/Integrate/libraries.html#-Webhook-Libraries) of our API Libraries list. + +{% warning %} +If your email traffic generates a lot of events, the incoming data can quickly overload a web server if not configured correctly. You can load test your endpoints with loader.io for free. +{% endwarning %} + +{% anchor h3 %} +Integrating +{% endanchor %} + +Once you choose a storage option, follow steps 3 through 8 in [Getting started](#-Getting-started]) to update your [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) in the [SendGrid UI](https://app.sendgrid.com). Update the **HTTP POST URL field** to your URL, and make sure you've selected the events that you want to receive. + +The Event Webhook does not follow redirects. + +If you want to receive encrypted posts, your callback URL needs to support TLS 1.2. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Event Webhook reference]({{root_url}}/API_Reference/Event_Webhook/event.html) +- [Troubleshooting the Event Webhook]({{root_url}}/API_Reference/Event_Webhook/troubleshooting.html) +- [An Event Webhook case study](https://sendgrid.com/blog/leveraging-sendgrids-event-api/) +- [Webhook web libraries]({{root_url}}/Integrate/libraries.html#-Webhook-Libraries) +- [Getting started with Keen.io]({{root_url}}/Integrate/Tutorials/analytics_with_keen_io.html) diff --git a/source/API_Reference/Event_Webhook/troubleshooting.md b/source/API_Reference/Event_Webhook/troubleshooting.md new file mode 100644 index 0000000000..b03522d296 --- /dev/null +++ b/source/API_Reference/Event_Webhook/troubleshooting.md @@ -0,0 +1,56 @@ +--- +seo: + title: Troubleshooting + description: Tips and tricks to troubleshoot your SendGrid Event Webhook, including common issues. + keywords: event webhook, troubleshooting, events, duplication, load handling, duplicate events +title: Troubleshooting +weight: 80 +layout: page +navigation: + show: true +--- +- [General troubleshooting]() +- [Common issues]() + - [Duplicate events]() + - [Load handling]() + +{% anchor h2 %} +General troubleshooting +{% endanchor %} + +*Considerations for troubleshooting your Event Webhook instance:* + +- Start by making sure your web server is returning a 2xx response to our servers. Any other response type will result in our server retrying a POST until we receive a 2xx response or the maximum time has expired. All events are retried at increasing intervals for up to 24 hours after the event occurs. +- Next, make sure you are not blocking our IPs that are trying to POST to your server. Our IPs change often since we constantly add more machines. +- http://httpresponder.com/ is a helpful tool for debugging webhooks. +- You can use the **Test Your Integration** button on the [Settings > Mail Settings](https://app.sendgrid.com/settings/mail_settings) page in the [SendGrid UI](https://app.sendgrid.com) to send simulated events to your callback URL. You can also send a POST from a shell using cURL - this will give you the full response your server is returning including the HTTP headers: + +{% codeblock lang:bash %} +curl -X POST -H "Content-Type: application/json" -d '[{"email":"john.doe@sendgrid.com","timestamp":1337197600,"smtp-id":"<4FB4041F.6080505@sendgrid.com>","event":"processed"},{"email":"john.doe@sendgrid.com","timestamp":1337966815,"category":"newuser","event":"click","url":"https://sendgrid.com"},{"email":"john.doe@sendgrid.com","timestamp":1337969592,"smtp-id":"<20120525181309.C1A9B40405B3@Example-Mac.local>","event":"processed"}]' +{% endcodeblock %} + +- If you're not getting a response from your server, follow the steps in [Getting started with the Event Webhook]({{root_url}}/API_Reference/Event_Webhook/getting_started_event_webhook.html) to test your SendGrid instance with Webhook tester. You could also use tools like ngrok, or Runscope. + +{% anchor h2 %} +Common issues +{% endanchor %} + +{% anchor h3 %} +Duplicate events +{% endanchor %} + +**It is possible to see duplicate events in the data posted by the Event Webhook.** + +We recommend that you use some form of deduplication when processing or storing your Event Webhook data using the `sg_event_id` as a differentiator since this ID is unique for every event where `sg_event_id` is present. + +The `sg_event_id` is a [UUIDv4](https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_(random) string that is `Base64url` encoded. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Getting started with the Event Webhook]({{root_url}}/API_Reference/Event_Webhook/getting_started_event_webhook.html) +- [Event webhook reference]({{root_url}}/API_Reference/Event_Webhook/event.html) +- [An Event Webhook case study](https://sendgrid.com/blog/leveraging-sendgrids-event-api/) +- [Webhook web libraries]({{root_url}}/Integrate/libraries.html#-Webhook-Libraries) +- [Getting started with Keen.io]({{root_url}}/Integrate/Tutorials/analytics_with_keen_io.html) diff --git a/source/API_Reference/Webhooks/inbound_email.md b/source/API_Reference/Parse_Webhook/inbound_email.md similarity index 100% rename from source/API_Reference/Webhooks/inbound_email.md rename to source/API_Reference/Parse_Webhook/inbound_email.md diff --git a/source/API_Reference/SMTP_API/apps.html b/source/API_Reference/SMTP_API/apps.html index 269c28ab1a..0560edc78a 100644 --- a/source/API_Reference/SMTP_API/apps.html +++ b/source/API_Reference/SMTP_API/apps.html @@ -56,7 +56,7 @@ "bcc" : { "settings" : { "enable" : 1, - "email" : "you@example.com" + "email" : "example@example.com" } } } @@ -393,7 +393,7 @@ <h4>Example X-SMTPAPI Header Value</h4> {% endanchor %} <p>Inserts a subscription management link at the bottom of the text and html bodies or insert the link anywhere in the email.</p> -<p>If you wish to append an unsubscription link, use the <code>text/html</code> and <code>text/plain</code> paremeters. However, if you wish to have the link replace a tag (such as <code>[unsubscribe]</code>), use the <code>replace</code> parameter.</p> +<p>If you wish to append an unsubscription link, use the <code>text/html</code> and <code>text/plain</code> parameters. However, if you wish to have the link replace a tag (such as <code>[unsubscribe]</code>), use the <code>replace</code> parameter.</p> <table class="table table-striped table-bordered"> <tbody> @@ -455,7 +455,7 @@ <h4>Example X-SMTPAPI Header Value</h4> {% endinfo %} -<p>Uses a <a href="{{root_url}}/API_Reference/Web_API_v3/Transactional_Templates/index.html">transactional template</a> when sending an email. More information on using transactional templates with the SMTP API may be found in the <a href="{{root_url}}/API_Reference/Web_API_v3/Transactional_Templates/smtpapi.html">transactional templates API Reference</a>. +<p>Uses a <a href="{{root_url}}/API_Reference/Web_API_v3/Transactional_Templates/index.html">transactional template</a> when sending an email. <table class="table table-striped table-bordered"> <tbody> diff --git a/source/API_Reference/SMTP_API/building_an_smtp_email.md b/source/API_Reference/SMTP_API/building_an_smtp_email.md new file mode 100644 index 0000000000..ee914d66bc --- /dev/null +++ b/source/API_Reference/SMTP_API/building_an_smtp_email.md @@ -0,0 +1,216 @@ +--- +seo: + title: Building an SMTP Email + description: Learn how to build email content, add recipients and schedule your send. + keywords: SMTP, send email, integrate, building, filters, scheduling, substitution, suppression groups, unique arguments, recipients +title: Building an SMTP Email +weight: 949 +layout: page +navigation: + show: true +--- +Now that you've sent a [sent a test SMTP email with Telnet]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html), and [integrated with SendGrid]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html), it's time to build content. + +- [Getting started building](#-Getting-started-building) + - [Limitations](#-Limitations) +- [Customizing Your Send](#-Customizing-your-send-filters) + - [Scheduling Your Send](#-Scheduling-Your-Send) + - [Substitution Tags](#-Substitution-Tags) + - [Section Tags](#-Section-Tags) + - [Suppression Groups](#-Suppression-Groups) + - [Categories](#-Categories) + - [Unique Arguments](#-Unique-Arguments) + +{% anchor h2 %} +Getting started building +{% endanchor %} + +SMTP works by passing a JSON string with as many SMTP objects as you want to SendGrid. To do this, add the JSON string to your message under a header named "X-SMTPAPI" like this: + +{% codeblock lang:json %}{ + "to": [ + "example@example.com", + "example@example.com" + ], + "sub": { + "%name%": [ + "Ben", + "Joe" + ], + "%role%": [ + "%sellerSection%", + "%buyerSection%" + ] + }, + "section": { + "%sellerSection%": "Seller information for: %name%", + "%buyerSection%": "Buyer information for: %name%" + }, + "category": [ + "Orders" + ], + "unique_args": { + "orderNumber": "12345", + "eventID": "6789" + }, + "filters": { + "footer": { + "settings": { + "enable": 1, + "text/plain": "Thank you for your business" + } + } + }, + "send_at": 1409348513 +} +{% endcodeblock %} + +{% anchor h3 %} +Limitations +{% endanchor %} + +- There is a hard limit of 10,000 addresses in a multiple recipient e-mail. However, the best practice is to split up large jobs to around 1,000 recipients - this allows better processing load distribution. If you have a large number of additional substitutions or sections in the headers, it is best to split the send into even smaller groups. +- When using the X-SMTPAPI to send to multiple recipients, you cannot use the standard SMTP protocols "TO" field to send to multiple recipients because doing so can generate duplicate messages to the addresses listed in both. For more information, see <a href="https://tools.ietf.org/html/rfc5321">RFC 5321</a>. +- Ensure that the header is limited to a maximum total line length of 1,000 characters. Failure to do this can cause intermediate MTA's to split the header on non-space boundaries- this causes inserted spaces in the final e-mail. If your e-mail is going through another MTA before reaching SendGrid, it is likely to have an even lower setting for maximum header length and may truncate the header. +- When using the API, if our system encounters a parsing error, the message will be bounced to the address specified in the MAIL FROM portion of the SMTP session. The MAIL FROM address is re-written when we send the e-mail out for final delivery, so it is safe to set this to an address that can receive the bounces so that you will be alerted to any errors. +- When sending Unicode characters via the SMTP API, you should escape these characters using the `\u` escape character. When you do this, Unicode characters like ` á` becomes `\u00E1`. + +{% anchor h2 %} +Customizing your send (filters) +{% endanchor %} + +You can customize the emails you send via SMTP by using different settings (also referred to as filters). Change these settings in the **X-SMTPAPI header**. + +For example, to send a blind carbon copy (BCC) of your email to the address example@example.com, include the following in your X-SMTPAPI header: + +{% codeblock lang:json %} +{ + "filters" : { + "bcc" : { + "settings" : { + "enable" : 1, + "email" : "example@example.com" + } + } + } +} +{% endcodeblock %} + +The X-SMTPAPI header is a JSON-encoded associative array consisting of several sections, below are examples of JSON strings using each section. Add this header to any SMTP message sent to SendGrid and the instructions in the header will be interpreted and applied to that message’s transaction. You can enable these sections with the X-SMTPAPI header: + +- [Scheduling Your Send](#-Scheduling-your-send) +- [Substitution Tags](#-Substitution-tags) +- [Section Tags](#-Section-tags) +- [Suppression Groups](#-Suppression-groups) +- [Categories](#-Categories) +- [Unique Arguments](#-Unique-arguments) + +{% anchor h3 %} +Scheduling Your Send +{% endanchor %} + +Schedule your email send time using the `send_at` parameter within your X-SMTPAPI header. Set the value of `send_at` to the [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time). + +{% codeblock lang:json %} +{ + "send_at": 1409348513 +} +{% endcodeblock %} + +For more information, see our [scheduling parameters documentation]({{root_url}}/API_Reference/SMTP_API/scheduling_parameters.html). + +{% anchor h3 %} +Substitution Tags +{% endanchor %} + +Substitution tags allow you to dynamically insert specific content relevant to each of your recipients, such as their first and last names. + +For example, to use a substitution tag to replace the first name of your recipient, insert the tag {% raw %}{{name}}{% endraw %} in the HTML of your message: + +{% codeblock lang:html %} +<html> + <head></head> + <body> + <p>Hello {% raw %}{{name}}{% endraw %},<br> + The body of your email would go here... + </p> + </body> +</html> +{% endcodeblock %} + +To define the value that will replace the {% raw %}{{name}}{% endraw %} tag, define the following in your X-SMTPAPI header: + +{% codeblock lang:json %} +{ + "to": [ + "john.doeexampexample@example.com", + "example@example.com" + ], + "sub": { + "{% raw %}{{name}}{% endraw %}": [ + "John", + "Jane" + ] + } +} +{% endcodeblock %} + +For more information, see our [substitution tags documentation]({{root_url}}/API_Reference/SMTP_API/substitution_tags.html). + +{% anchor h3 %} +Section Tags +{% endanchor %} + +Section tags are similar to substitution tags, but rather than replace tags with content for each recipient; section tags allow you to replace a tag with more generic content— like a salutation. + +For more information, see our [section tags documentation]({{root_url}}/API_Reference/SMTP_API/section_tags.html). + +{% anchor h3 %} +Suppression Groups +{% endanchor %} + +You can easily specify an unsubscribe group for an email sent via SMTP by including the `asm_group_id` parameter in your X-SMTPAPI header. Simply set the value of `asm_group_id` to the numerical ID of the group you would like to use. + +{% codeblock lang:json %} +{ + "asm_group_id": 1 +} +{% endcodeblock %} + +For more information, see our [suppression groups documentation]({{root_url}}/API_Reference/SMTP_API/suppressions.html). + +{% anchor h3 %} +Categories +{% endanchor %} + +Categories allow you to track your emails according to broad topics that you define, like "Weekly Newsletter" or "Confirmation Email". Simply define the category by using the `category` parameter within your X-SMTPAPI header: + +{% codeblock lang:json %} +{ + "category": "Example Category" +} +{% endcodeblock %} + +For more information, see our [categories documentation]({{root_url}}/API_Reference/SMTP_API/categories.html) + +{% info %} +Categories should only be used for broad topics. To attach unique identifiers, please use [unique arguments]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html). +{% endinfo %} + +{% anchor h3 %} +Unique Arguments +{% endanchor %} + +Use unique arguments to track your emails based on specific identifiers unique to individual messages. Unique arguments can be retrieved via SendGrid's [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html) or your [email activity page]({{root_url}}/User_Guide/email_activity.html). + +For more information, see our [unique arguments documentation]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html). + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Getting Started with the UI]({{root_url}}/User_Guide/Marketing_Campaigns/getting_started.html) +- [Getting Started with the API]({{root_url}}/API_Reference/api_v3.html) +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Getting Started with the SMTP API]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html) +- [Integrating with SMTP]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html) diff --git a/source/API_Reference/SMTP_API/categories.md b/source/API_Reference/SMTP_API/categories.md index c7d4d88209..1f41e3d6d5 100644 --- a/source/API_Reference/SMTP_API/categories.md +++ b/source/API_Reference/SMTP_API/categories.md @@ -35,6 +35,10 @@ You can use SendGrid's [SMTP API]({{root_url}}/API_Reference/SMTP_API/) to add t In this example, SendGrid would associate statistics for the email containing that header with the category **Example Category**. +{% anchor h2%} +Limitations +{% endanchor %} + You can assign up to 10 categories per message: {% codeblock lang:json %} diff --git a/source/API_Reference/SMTP_API/errors_and_troubleshooting.md b/source/API_Reference/SMTP_API/errors_and_troubleshooting.md new file mode 100644 index 0000000000..6640329b5a --- /dev/null +++ b/source/API_Reference/SMTP_API/errors_and_troubleshooting.md @@ -0,0 +1,136 @@ +--- +seo: + title: Errors and Troubleshooting + description: SMTP Response codes and troubleshooting tips + keywords: SMTP, send email, integrate, building, filters, scheduling, substitution, suppression groups, unique arguments, recipients +title: Errors and Troubleshooting +weight: 0 +layout: page +navigation: + show: true +--- + +- [Response codes](#-Response-codes) +- [Turning off click tracking](#-Turning-off-click-tracking) +- [Invalid SMTP API Header](#-Invalid-SMTP-API-Hheader) +- [Certificate verification failed for smtp.sendgrid.net](#-Certificate-verification-failed-for-smtp.sendgrid.net) + +{% anchor h3 %} +Response codes +{% endanchor %} + +Each SMTP call you make returns a response. `200` responses are usually success responses, and `400` responses are usually deferrals. SendGrid continues to retry resending `400` messages for up to 72 hours. `500` responses are hard failures that are not retried by our servers. This table has possible response codes with example errors and a general explanation of that sort of response. This is not an all-inclusive list - if you are getting an error you don't recognize, check out our [Deliverability center](https://sendgrid.com/deliverabilitycenter/#/). + +<table class="table" style="table-layout:fixed"> + <tr> + <th>Error</th> + <th>Message</th> + <th>Explaination</th> + </tr> + <tr> + <td>250</td> + <td>`Queued mail for delivery`</td> + <td>Your mail has been successfully queued! This response indicates that the recipient server has accepted the message.</td> + </tr> + <tr> + <td>421</td> + <td>`Message from (X.X.X.X) temporarily deferred`</td> + <td>Messages are temporarily deferred because of recipient server policy - often it's because of too many messages or connections in too short of a timeframe. We continue to retry deferred messages for up to 72 hours. Consider temporarily sending less messages to a domain that is returning this code because this could further delay your messages currently being tried.</td> + </tr> + <tr> + <td>450</td> + <td>`too frequent connects from 198.37.147.135, please try again later.`</td> + <td>The message failed because the reciepients mailbox was unavailable, perhaps because it was locked or was not routable at the time. We continue to retry messages for up to 72 hours. Consider temporarily sending less messages to a domain that is returning this code because this could further delay your messages currently being tried.</td> + </tr> + <tr> + <td>451</td> + <td>`Temporary local problem - please try later`</td> + <td>The message simply failed, usually due to a far-end server error. We continue to retry messages for up to 72 hours.</td> + </tr> + <tr> + <td>452</td> + <td>`Too many recipients received this hour (throttled)`</td> + <td>The message has been deferred due to insufficient system storage. We continue to retry messages for up to 72 hours.</td> + </tr> + <tr> + <td>550</td> + <td>`Requested action not taken: mailbox unavailable`</td> + <td>The user’s mailbox was unavailable. Usually because it could not be found, or because of incoming policy reasons. Remove these address from your list - it is likely a fake, or it was mistyped.</td> + </tr> + <tr> + <td>551</td> + <td>`User does not exist.`</td> + <td>The intended mailbox does not exist on this recipient server. Remove these addresses from your list.</td> + </tr> + <tr> + <td>552</td> + <td>`This message is larger than the current system limit or the recipient’s mailbox is full. Create a shorter message body or remove attachments and try sending it again.`</td> + <td>The recepients mailbox has exceeded its storage limits. We don't resend messages with this error code because this is usually a sign this is an abandoned email.</td> + </tr> + <tr> + <td>553</td> + <td>`Invalid/inactive user.`</td> + <td>The message was refused because the mailbox name is either malformed or does not exist. Remove these addresses from your list.</td> + </tr> + <tr> + <td>554</td> + <td>`ERROR: Mail refused`</td> + <td>This is a default response that can be caused by a lot of issues. There is often a human readable portion of this error that gives more detailed information, but if not, remove these addresses from your list.</td> + </tr> + <tr> + <td>Other</td> + <td>`Delayed Bounce - Unable to Parse Server Reason`</td> + <td>This is what SendGrid displays when the reciepients server returns a blank reason code.</td> + </tr> +</table> + +{% anchor h2 %} +Turning off click tracking +{% endanchor %} + +To turn off click tracking, add this to your X-SMTPAPI header: + +{% codeblock lang:json %} +{ + "filters": { + "clicktrack": { + "settings": + { + "enable": 0 + } + } + } +} +{% endcodeblock %} + +{% anchor h2 %} +Invalid SMTP API header +{% endanchor %} + +When you try to send an invalid X-SMTPAPI header, you will get an email with details about the invalidations. You may also see errors on your Email Activity page or in your Event Webhook data. If this happens, the email should give you the information you need to begin troubleshooting. We also recommend uploading your JSON into a JSON validator, because this is often an invalid JSON issue. + +{% anchor h2 %} +Certificate verification failed for smtp.sendgrid.net +{% endanchor %} + + `"certificate verification failed for [smtp.sendgrid.net](http://smtp.sendgrid.net/)[198.37.144.225]:587: untrusted issuer /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority"` + + If you receive this error, the connection is still encrypted; it's just that your server doesn't have the necessary CA (certificate authority) certificates to confirm that our certificate is valid. + + *To update your certificates:* + +1. ownload the GoDaddy CA bundle from [https://certs.godaddy.com/anonymous/repository.pki](https://certs.godaddy.com/anonymous/repository.pki) (grab the one called `"gd\_bundle-g2-g1.crt"`). +1. Save that on your server. +1. Tell Postfix where to find it by adding or editing the following line in `/etc/postfix/` [main.cf](http://main.cf/): `"smtp\_tls\_CAfile = /etc/postfix/ssl/gd\_bundle-g2-g1.crt"` +1. Restart Postfix to make the change take effect. + + If the mail server communicates with more than just us, add this certificate to your existing CA bundle (frequently called `ca-bundle.crt`). + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Getting Started with the SMTP API]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html) +- [Integrating with SMTP]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html) +- [Building an SMTP Email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html) diff --git a/source/API_Reference/SMTP_API/getting_started_smtp.md b/source/API_Reference/SMTP_API/getting_started_smtp.md new file mode 100644 index 0000000000..1b41c3fd2b --- /dev/null +++ b/source/API_Reference/SMTP_API/getting_started_smtp.md @@ -0,0 +1,81 @@ +--- +seo: + title: How to Send an SMTP Email + description: Use Telnet to send your first SMTP email + keywords: telnet, ports, connection, SMTP, send email, getting started +title: How to Send an SMTP Email +weight: 960 +layout: page +navigation: + show: true +--- + +<iframe src="https://player.vimeo.com/video/190122014" width="700" height="400" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> + +You can also send email with [the UI](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/getting_started.html) and with [the API]({{root_url}}/API_Reference/api_v3.html). + +- [What is SMTP?](#-What-is-smtp) +- [Sending a test SMTP email with Telnet](#-Sending-a-test-SMTP-email-with-Telnet) + +{% anchor h2 %} +What is SMTP? +{% endanchor %} + +[SMTP]({{root_url}}/Glossary/smtp.html), or _simple mail transfer protocol_, is a quick and easy way to send email from one server to another. SendGrid provides an SMTP service that allows you to deliver your email via our server instead of your client or server. + +SendGrid’s SMTP API allows developers to specify custom handling instructions for e-mail using an X-SMTPAPI header inserted into the message. The header is a JSON encoded list of instructions and options for that email. + +The X-SMTPAPI headers that you add are stripped from the final email because they are instruction headers for how SendGrid will handle your email. + +For a deeper dive into what SMTP is, the benefits of sending an email with SMTP, and how SendGrid can help, see the [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) on our blog. + +{% anchor h2 %} +Sending a test SMTP email with Telnet +{% endanchor %} + +{% anchor h3 %} +Before you begin +{% endanchor %} + +- Create a SendGrid API key on the [API Keys page](https://app.sendgrid.com/settings/api_keys). +- Open your command line, bash, shell, or Terminal functionality (depending on what OS you are using). You'll use this window to input the commands to initiate a telnet connection. +- Convert your API key to Base64. It is not secure to put your API key into an external webpage for a conversion, so we recommend using a bash conversion. If you are on Mac or Linux, you can use the pre-installed OpenSSL package. Use this cmd to convert your API key using OpenSSL: `echo -n '<<YOUR_API_KEY>>' | openssl base64`. Save your converted key for a later step. + +{% warning %} +Telnet does not register backspaces correctly - so you have to type your commands correctly (or copy and paste it from here). +{% endwarning %} + +*To send SMTP email using Telnet:* + +1. Start your session by typing in the terminal: `TELNET smtp.sendgrid.net 25`. + <br>SendGrid accepts unencrypted and TLS connections on ports **25**, **587**, & **2525**. You can also connect via SSL on port **465**. Many hosting providers and ISPs block port 25 as a default practice. If this is the case, contact your host/ISP to find out which ports are open for outgoing SMTP relay. We recommend port 587 to avoid any rate limiting that your server host may apply. +1. Once you successfully connect to the SendGrid, login to the server by typing `AUTH LOGIN`. + <br>The mail server responds with `334 VXNlcm5hbWU6`, a Base64 encoded request for your username. If you receive this error: `'telnet' is not recognized as an internal or external command, operable program or batch file`, you need to install Telnet on your machine. Telnet comes natively on most operating systems. +1. Input the API username encoded in Base64. Everyone's username is `apikey`, which is `YXBpa2V5` in Base64. + <br>The mail server responds with `334 UGFzc3dvcmQ6`. This response is a Base64 encoded request for your password (your API Key). +1. Enter your Base64 converted API key in the next line as the password. + <br>The mail server responds with `235 Authentication successful`. Getting this far indicates that your connection to smtp.sendgrid.net over the chosen port is open and that your API key is valid. +1. Next, add the email that you’re sending from: `mail from:<<SENDER_EMAIL>`. + <br>The mail server responds with `250 Sender address accepted`. +1. Add the email that you’re sending to: `rcpt to:<<RECIEPIENT_ADDRESS>>`. + <br>The mail server responds with `250 Recipient address accepted`. +1. On the next line, type `DATA` - this indicates that you’re typing the email content. +1. Optionally, add a mail-to header to add the name and email address of the recipient to the email header: `To: <<NAME>> <<EMAIL>>`. +1. Next, add a from header to add the name and email address of the sender to the email header - if not included, SendGrid blocks your email because it doesn’t follow RFC 5322 compliance guidelines: `From: NAME <<EMAIL>`. +1. Include a subject line: `Subject: <<EMAIL_SUBJECT>>` +1. Add the content of the message: `<<MESSAGE>>`. For example: `“This is a test for the SMTP relay."` +1. Finally, send the email with a period and then press enter: `.[Enter]` + <br>The mail server returns `250 Ok: queued as …` - This means the email has been queued to send. This queue moves very quickly. +1. Exit the Telnet connection with: `quit`. + +Now that you've sent a test email, learn to [integrate your servers with our SMTP API]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html). + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Getting Started with the UI]({{root_url}}/User_Guide/Marketing_Campaigns/getting_started.html) +- [Getting Started with the API]({{root_url}}/API_Reference/api_v3.html) +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Integrating with the SMTP API]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html) +- [Building an SMTP Email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html) diff --git a/source/API_Reference/Web_API_v3/Transactional_Templates/smtpapi.md b/source/API_Reference/SMTP_API/how_to_use_a_transactional_template_with_smtp.md similarity index 90% rename from source/API_Reference/Web_API_v3/Transactional_Templates/smtpapi.md rename to source/API_Reference/SMTP_API/how_to_use_a_transactional_template_with_smtp.md index 4d608e4328..095721df8f 100644 --- a/source/API_Reference/Web_API_v3/Transactional_Templates/smtpapi.md +++ b/source/API_Reference/SMTP_API/how_to_use_a_transactional_template_with_smtp.md @@ -1,7 +1,11 @@ --- +seo: + title: How to use a Transactional Template with the SMTP API + description: Learn how to send a transactional template with the SMTP API. + keywords: SMTP, send email, integrate, building, filters, scheduling, substitution, suppression groups, unique arguments, recipients, transactional template +title: How to use a Transactional Template with the SMTP API +weight: 949 layout: page -title: Using Transactional Templates With The SMTP API -alias: /API_Reference/Web_API_v3/Transactional_Templates/smtpapi.html navigation: show: true --- @@ -88,7 +92,7 @@ using the SMTP API header: {% codeblock lang:json %} { "to": [ - "alice@sendgrid.com", + "example@example.com", "bob@sendgrid.com" ], "sub": { diff --git a/source/API_Reference/SMTP_API/index.html b/source/API_Reference/SMTP_API/index.html deleted file mode 100644 index 5460c90c78..0000000000 --- a/source/API_Reference/SMTP_API/index.html +++ /dev/null @@ -1,124 +0,0 @@ ---- -layout: page -weight: 1000 -title: SMTP API Overview -navigation: - show: true -seo: - title: SMTP API, Advanced Email Features - SendGrid Documentation | SendGrid - override: true - description: The SMTP API gives you advanced control over the emails you send. Through the X-SMTPAPI header, you can replace values, categorize messages and more. ---- - -<p>SendGrid's SMTP API allows developers to specify custom handling instructions for e-mail. This is accomplished through a header, X-SMTPAPI, that is inserted into the message. The header is a JSON encoded list of instructions and options for that email.</p> - -<p>The X-SMTPAPI headers that you add will be stripped from the final email, because they are instruction headers for how SendGrid will handle your email. So you can expect to not actually see these headers in the final email.</p> - -{% anchor h4 %} -An example X-SMTPAPI header -{% endanchor %} - -{% codeblock lang:json %}{ - "category": [ - "newuser" - ] -} -{% endcodeblock %} -<p>In this case, the header is telling the processing routine to assign this email the <a href="{{root_url}}/User_Guide/Delivery_Metrics/categories.html">category</a> of "newuser".</p> - -{% anchor h2 %} -The X-SMTPAPI Header -{% endanchor %} - -<p>The X-SMTPAPI header is a JSON-encoded associative array consisting of several sections, below are examples of JSON strings using each section. This header can be added to any SMTP message sent to SendGrid and the instructions in the header will be interpreted and applied to that message's transaction.</p> - -<em>See <a href="{{root_url}}/API_Reference/SMTP_API/using_the_smtp_api.html#-Requirements-and-Limitations">Requirements and Limitations</a></em> - -<p> - <a href="{{root_url}}/API_Reference/SMTP_API/apps.html">Apps</a>: An associative array of filters and their settings, used to override filter settings is already setup for your account. Settings are an associative array of the setting names and their values. -</p> -{% codeblock lang:json %}{ - "filters": { - "footer": { - "settings": - { - "enable": 1, - "text/plain": "Thank you for your business" - } - } - } -} -{% endcodeblock %} - -<p> - <a href="{{root_url}}/API_Reference/SMTP_API/categories.html">Category</a>: Associates the category of email this should be logged as. You may insert up to 10 categories as an array, these categories are not predefined. Categories are intended for broader tracking, such as "newsletter" or "password_reset". -</p> -{% codeblock lang:json %}{ - "category": [ - "category1", - "category2" - ] -} -{% endcodeblock %} - -<p> - <a href="{{root_url}}/API_Reference/SMTP_API/scheduling_parameters.html">Scheduling Parameters</a>: A collection of attributes that can delay sending and allow for faster mail flow. -</p> - -{% codeblock lang:json %} -{ - "send_at": 1409348513 -} -{% endcodeblock %} - -<p> - <a href="{{root_url}}/API_Reference/SMTP_API/section_tags.html">Section</a>: Sections can be used to simplify substitution values that are common to many recipients. This is an associative array of sections that can be used in substitution values. -</p> -{% codeblock lang:json %}{ - "section": { - "%sellerSection%": "Seller information for: %name%", - "%buyerSection%": "Buyer information for: %name%" - } -} -{% endcodeblock %} - -<p> - <a href="{{root_url}}/API_Reference/SMTP_API/substitution_tags.html">Substitution</a>: An associative array of substitution tags, where each tag is associated with a list of replacement text for the tag in the body text. Each Substitution value corresponds to an email in the "To" section of the JSON string. -</p> -{% codeblock lang:json %}{ - "sub": { - "%name%": [ - "Ben", - "Joe" - ], - "%role%": [ - "%sellerSection%", - "%buyerSection%" - ] - } -} -{% endcodeblock %} - -<p> - <a href=" ">To:</a> An array of addresses to send the message to, optionally including the display name. -</p> -{% codeblock lang:json %}{ - "to": [ - "<ben@example.com>", - "Joe Smith <joe@example.com>" - ] -} -{% endcodeblock %} - -<p> - <a href="{{root_url}}/API_Reference/SMTP_API/unique_arguments.html">Unique Arguments</a>: An associative array of arguments and their values to be applied to all emails sent in this SMTP API transaction. Unique Args are intended for more detailed tracking, such as "newsletter_fall_sale_1_1_14" or "password_reset_user123456". -</p> -{% codeblock lang:json %}{ - "unique_args": { - "orderNumber": "12345", - "eventID": "6789" - } -} -{% endcodeblock %} - -For an example X-SMTPAPI header using all the above methods see our <a href= "{{root_url}}/API_Reference/SMTP_API/using_the_smtp_api.html"> Using the SMTP API</a> page. diff --git a/source/API_Reference/SMTP_API/integrating_with_the_smtp_api.md b/source/API_Reference/SMTP_API/integrating_with_the_smtp_api.md new file mode 100644 index 0000000000..b6f794eac7 --- /dev/null +++ b/source/API_Reference/SMTP_API/integrating_with_the_smtp_api.md @@ -0,0 +1,54 @@ +--- +seo: + title: Integrating with the SMTP API + description: Set your systems up to use SendGrid SMTP API + keywords: ports, connection, SMTP, send email, integrate, rate limits, setting up +title: Integrating with the SMTP API +weight: 950 +layout: page +navigation: + show: true +--- + +- [Integrating with SendGrid](#-Integrating-with-SendGrid]) +- [Ports](#-SMTP-Ports) +- [Rate limits](#-Rate-limits) + +{% anchor h2 %} +Integrating with Sendgrid +{% endanchor %} + +*To integrate with SendGrids SMTP API:* + +1. [Create an API Key](https://app.sendgrid.com/settings/api_keys) with at least "Mail" permissions. +2. Set the server host in your email client or application to `smtp.sendgrid.net`. + * This setting is sometimes referred to as the _external SMTP server_ or the _SMTP relay_. +3. Set your username to `apikey`. +4. Set your password to the API key generated in step 1. +5. Set the port to `587`. + +Now that you've integrated, learn to [build SMTP email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html). + +{% anchor h3 %} +SMTP Ports +{% endanchor %} + +- For an unencrypted or a [TLS connections]({{root_url}}/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.html), use port `25`, `2525`, or `587`. +- For a [SSL connections]({{root_url}}/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.html), use port `465`. + +{% anchor h3 %} +Rate limits +{% endanchor %} + +- You may send up to **100 messages per SMTP connection**. +- You may open up to **10 concurrent connections from a single server**. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Getting Started with the UI]({{root_url}}/User_Guide/Marketing_Campaigns/getting_started.html) +- [Getting Started with the API]({{root_url}}/API_Reference/api_v3.html) +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Getting Started with the SMTP API]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html) +- [Building an SMTP Email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html) \ No newline at end of file diff --git a/source/API_Reference/SMTP_API/scheduling_parameters.md b/source/API_Reference/SMTP_API/scheduling_parameters.md index 560cc0b501..d5a8a91d80 100644 --- a/source/API_Reference/SMTP_API/scheduling_parameters.md +++ b/source/API_Reference/SMTP_API/scheduling_parameters.md @@ -1,21 +1,23 @@ --- -layout: page -weight: 0 +seo: + title: Scheduling Parameters + description: Scheduling an email with SMTP + keywords: SMTP, send email, scheduling title: Scheduling Parameters +weight: 10 +layout: page navigation: show: true --- -With scheduling you can send large volumes of email in queued batches or target individual recipients by specifying a custom UNIX timestamp parameter. +With scheduling, you can send large volumes of email in queued batches or target individual recipients by specifying a custom UNIX timestamp parameter. Using the parameters defined below, you can queue batches of emails targeting individual recipients. {% info %} **Emails can be scheduled up to 72 hours in advance.** However, this scheduling constraint does not apply to campaigns sent via [Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/index.html). {% endinfo%} -This parameter allows SendGrid to begin processing a customer’s email requests before sending. SendGrid will then queue those messages and release -them when the timestamp is exceeded. This technique allows for a more efficient way to distribute large email requests and can **improve overall mail delivery time** -performance. This functionality: +This parameter allows SendGrid to begin processing a customer’s email requests before sending. SendGrid queues the messages and releases them when the timestamp indicates. This technique allows for a more efficient way to distribute large email requests and can **improve overall mail delivery time** performance. This functionality: * Improves efficiency of processing and distributing large volumes of email. * Reduces email pre-processing time. @@ -23,18 +25,18 @@ performance. This functionality: * Is available for free to all SendGrid customers. {% info %} -Scheduled sends can be cancelled, if you include a batch ID with your send. For more information, check out [Cancel Scheduled Sends]({{root_url}}/API_Reference/Web_API_v3/cancel_schedule_send.html)! +Cancel Scheduled sends by including a batch ID with your send. For more information, check out [Cancel Scheduled Sends]({{root_url}}/API_Reference/Web_API_v3/cancel_schedule_send.html)! {% endinfo %} {% warning %} -Using both `send_at` and `send_each_at` is not valid and will cause your request to be dropped. +Using both `send_at` and `send_each_at` is not valid. Setting both causes your request to be dropped. {% endwarning %} {% anchor h2 %} Send At {% endanchor %} -To schedule a send request for a large batch of emails use the `send_at` parameter which will send all emails at approximately the same time. `send_at` is a [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time). +To schedule a send request for a large batch of emails, use the `send_at` parameter which will send all emails at approximately the same time. `send_at` is a [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time). <h4>Example of send_at email header</h4> {% codeblock lang:json %} @@ -55,7 +57,10 @@ To schedule a send request for individual recipients; use `send_each_at` to send "to": [ "<ben@example.com>", "john@example.com", - "mike@example.com" + "mikeexampexample@example.com", + "<example@example.com>", + "example@example.com", + "example@example.com" ], "send_each_at": [ 1409348513, @@ -65,17 +70,30 @@ To schedule a send request for individual recipients; use `send_each_at` to send } {% endcodeblock %} -To allow for the cancellation of a scheduled send, you must include a `batch_id` with your send. The endpoint for cancellation needs a `batch_id` to cancel with. To generate a valid `batch_id`, use the [batch id generation endpoint]({{root_url}}/API_Reference/Web_API_v3/cancel_scheduled_send.html#Cancel-Scheduled-Sends). A `batch_id` is valid for 10 days (864,000 seconds) after generation. +To allow for the cancellation of a scheduled send, you must include a `batch_id` with your send. To generate a valid `batch_id`, use the [batch id generation endpoint]({{root_url}}/API_Reference/Web_API_v3/cancel_scheduled_send.html#Cancel-Scheduled-Sends). A `batch_id` is valid for 10 days (864,000 seconds) after generation. <h4>Example of including a batch_id</h4> {% codeblock lang:json %} { "to": [ + "<ben@example.com>", "john@example.com", - "mike@example.com" + "mikeexampexample@example.com", + "<example@example.com>", + "example@example.com", + "example@example.com" ], "send_at": 1409348513, "batch_id": "MWQxZmIyODYtNjE1Ni0xMWU1LWI3ZTUtMDgwMDI3OGJkMmY2LWEzMmViMjYxMw" } {% endcodeblock %} + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Getting Started with the SMTP API]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html) +- [Integrating with SMTP]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html) +- [Building an SMTP Email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html) diff --git a/source/API_Reference/SMTP_API/section_tags.md b/source/API_Reference/SMTP_API/section_tags.md index 21619de396..75f3803acc 100644 --- a/source/API_Reference/SMTP_API/section_tags.md +++ b/source/API_Reference/SMTP_API/section_tags.md @@ -1,15 +1,19 @@ --- -layout: page -weight: 0 +seo: + title: Section Tags + description: Section tags allow you to substitute in content in an SMTP message. + keywords: SMTP, send email, section tags title: Section Tags +weight: 10 +layout: page navigation: show: true --- -Section tags are similar to [substitution tags]({{root_url}}/API_Reference/SMTP_API/substitution_tags.html) in how they're built, but are specific to the message, not the recipient. You have to have a substitution tag value for **each** recipient, but you can have any number of section tags. Section tags can then contain Substitution tags for the recipient if needed. Section tags have to be contained within a Substitution tag, since SendGrid needs to know which data to populate for the recipient. +Section tags allow you to substitute in content in an SMTP message. Section tags are similar to [substitution tags]({{root_url}}/API_Reference/SMTP_API/substitution_tags.html) but are specific to the message, and not the recipient. You have to have a substitution tag value for **each** recipient, but you can have any number of section tags. Section tags can then contain Substitution tags for the recipient if needed. Section tags have to be contained within a Substitution tag since SendGrid needs to know which data to populate for the recipient. See the [Section Tag Example Walkthrough](#-Section-Tag-Example-Walkthrough) below. -It's possible & acceptable to use only Substition tags. However, that method is not [DRY](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself), and you may come against [message size limitations]({{root_url}}/Classroom/Build/Add_Content/whats_the_recommended_message_size_limit.html). +It's possible & acceptable to use only Substitution tags. However, that method is not [DRY](http://en.wikipedia.org/wiki/Don%27t_repeat_yourself), and you may come against [message size limitations]({{root_url}}/Classroom/Build/Add_Content/whats_the_recommended_message_size_limit.html). * * * * * @@ -28,8 +32,11 @@ How you flag your section tags may depend on the library you use to create your {% endinfo %} {% warning %} -Do not use spaces inside your section or substitution tags! e.g. `%first name%` -The space breaks the string. +Do not use spaces inside your section or substitution tags! For example: `%first name%`. The space breaks the string. +{% endwarning %} + +{% warning %} +Do not nest section tags in sections - this causes your section to not be replaced. {% endwarning %} * * * * * @@ -38,7 +45,7 @@ The space breaks the string. Section Tag Walkthrough {% endanchor %} -Message body sent to SendGrid: +Message body sent to SendGrid: {% codeblock lang:html %} <html> @@ -60,9 +67,10 @@ The accompanying X-SMTPAPI JSON header would look like: {% codeblock lang:json %} { "to": [ - "alice@foo.com", + "example@example.com", "bob@bar.com", - "casey@baz.com" + "example@example.com", + "example@example.com" ], "sub": { ":salutation": [ @@ -143,3 +151,13 @@ Casey receives: </body> </html> {% endcodeblock %} + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Substitution Tags]({{root_url}}/API_Reference/SMTP_API/substitution_tags.html) +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Getting Started with the SMTP API]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html) +- [Integrating with SMTP]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html) +- [Building an SMTP Email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html) diff --git a/source/API_Reference/SMTP_API/substitution_tags.md b/source/API_Reference/SMTP_API/substitution_tags.md index 257118b730..fcf7ea49a3 100644 --- a/source/API_Reference/SMTP_API/substitution_tags.md +++ b/source/API_Reference/SMTP_API/substitution_tags.md @@ -1,12 +1,16 @@ --- -layout: page -weight: 0 +seo: + title: Substitution Tags + description: Section tags allow you to substitute in content for individual recipients in an SMTP message. + keywords: SMTP, send email, Substitution tags title: Substitution Tags +weight: 10 +layout: page navigation: show: true --- -<p>Substitution tags allow you to easily generate dynamic content for each recipient on your list. When you send to a list of recipients over SMTP API you can specify substitution tags specific to each recipient. For example, a first name that will then be inserted into an opening greeting like the following, where each recipient sees -firstName- replaced with their first name.</p> +<p>Substitution tags allow you to generate dynamic content for each recipient on your list. When you send to a list of recipients over SMTP API, you can specify substitution tags specific to each recipient. For example, a first name that will then be inserted into an opening greeting like the following, where each recipient sees -firstName- replaced with their first name.</p> {% codeblock lang:html %} "Dear -firstName-" @@ -20,15 +24,23 @@ navigation: {% endcodeblock %} {% info %} -Substitution tags will work in the Subject line as well as the body of the email. +Substitution tags will work in the Subject line, body of the email and in [Unique Arguments]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html). {% endinfo %} {% info %} -How you format your substitution tags may depend on the library you use to create your SMTP connection, the language you are writing your code in, or any intermediate mail servers that your servers will send mail through. In some cases -subVal- may be the best choice while in other %subVal% or #subVal# may make more sense. It is best to avoid characters that have special meaning in html, such as <,>, and &. These might end up encoded and will not be properly substituted. +Substitutions are limited to 10000 bytes per personalization block. +{% endinfo %} + +{% info %} +How you format your substitution tags may depend on the library you use to create your SMTP connection, the language you are writing your code in, or any intermediate mail servers that your servers will send mail through. In some cases -subVal- may be the best choice while in other %subVal% or #subVal# may make more sense. It is best to avoid characters that have special meaning in HTML, such as <,>, and &. These might end up encoded and will not be properly substituted. {% endinfo %} {% warning %} -Do not use spaces inside your substitution tags, e.g. %first name% +Do not use spaces inside your substitution tags, for example: `%first name%` +{% endwarning %} + +{% warning %} +Do not nest substitution tags in substitutions as they will fail and your substitution will not take place. {% endwarning %} {% anchor h2%} @@ -41,10 +53,7 @@ Email HTML content: <head></head> <body> <p>Hello -name-,<br> - Thank you for your interest in our products. I have set up an appointment - to call you at -time- EST to discuss your needs in more detail. If you would - like to reschedule this call please visit the following link: - <a href="http://example.com/reschedule?id=-customerID-">reschedule</a> + Thank you for your interest in our products. I have set up an appointment to call you at -time- EST to discuss your needs in more detail. If you would like to reschedule this call, please visit the following link: `<a href="http://example.com/reschedule?id=-customerID-">reschedule</a>` Regards, @@ -59,8 +68,8 @@ Email HTML content: {% codeblock lang:json %}{ "to": [ - "john.doe@gmail.com", - "jane.doe@hotmail.com" + "example@example.com", + "example@example.com" ], "sub": { "-name-": [ @@ -93,10 +102,8 @@ Email HTML content: <head></head> <body> <p>Hello John,<br> - Thank you for your interest in our products. I have set up an appointment - to call you at 3:00pm EST to discuss your needs in more detail. If you would - like to reschedule this call please visit the following link: - <a href="http://example.com/reschedule?id=1234">reschedule</a> + Thank you for your interest in our products. I have set up an appointment to call you at 3:00 pm EST to discuss your needs in more detail. If you would like to reschedule this call, please visit the following link: + <a href="http://example.com/reschedule?id=1234">reschedule</a> Regards, @@ -113,10 +120,8 @@ Email HTML content: <head></head> <body> <p>Hello Jane,<br> - Thank you for your interest in our products. I have set up an appointment - to call you at 5:15pm EST to discuss your needs in more detail. If you would - like to reschedule this call please visit the following link: - <a href="http://example.com/reschedule?id=5678">reschedule</a> + Thank you for your interest in our products. I have set up an appointment to call you at 5:15pm EST to discuss your needs in more detail. If you would like to reschedule this call please visit the following link: + <a href="http://example.com/reschedule?id=5678">reschedule</a> Regards, @@ -130,9 +135,14 @@ Email HTML content: {% anchor h2 %} SendGrid Defined Substitution Tags {% endanchor %} -While the tags above are tags that you define at the time of your send in the SMTPAPI headers, SendGrid also offers [Unsubscribe Groups tags]({{root_url}}/User_Guide/Transactional_Templates/create_edit.html#-Unsubscribe-Substitution-Tags) that have been pre-defined for you. You can use these tags within the content of your email and you do not have to, and should not, define them. - - - - +While the tags above are tags that you define at the time of your send in the SMTPAPI headers, SendGrid also offers [Unsubscribe Groups tags]({{root_url}}/User_Guide/Transactional_Templates/create_and_edit_transactional_templates.html#-Adding-unsubscribe-links-to-a-template) that have been pre-defined for you. You can use these tags within the content of your email, and you do not have to and should not, define them. +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Section Tags]({{root_url}}/API_Reference/SMTP_API/section_tags.html) +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Getting Started with the SMTP API]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html) +- [Integrating with SMTP]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html) +- [Building an SMTP Email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html) \ No newline at end of file diff --git a/source/API_Reference/SMTP_API/suppressions.md b/source/API_Reference/SMTP_API/suppressions.md index cfc5007b92..16531372eb 100644 --- a/source/API_Reference/SMTP_API/suppressions.md +++ b/source/API_Reference/SMTP_API/suppressions.md @@ -1,7 +1,11 @@ --- -layout: page -weight: 0 +seo: + title: Suppression Groups + description: Suppression groups allow you to set up unsubscribe lists and options + keywords: SMTP, suppression groups, unsubscribe lists title: Suppression Groups +weight: 10 +layout: page navigation: show: true --- @@ -32,7 +36,7 @@ Defining Unsubscribe Groups to display on the Manage Preferences page To specify which groups to display on the Manage Preferences page of an email, add the group IDs to the X-SMTPAPI header of an SMTP message, or in the x-smtpapi parameter of a [mail.send API call]({{root_url}}/API_Reference/Web_API/mail.html). -If the asm_groups_to_display header is omitted, your default groups will be shown on the Manage Preferences page instead. +If you omit the asm_groups_to_display header, your default groups is shown on the Manage Preferences page instead. {% warning %} You can specify up to 25 groups to display. @@ -53,3 +57,12 @@ You can find your group IDs by looking at the Group ID column in the Unsubscribe Related Articles: * You can create Unsubscribe groups via the [API V3 > Unsubscribe Groups Endpoint]({{root_url}}/API_Reference/Web_API_v3/Unsubscribe_Manager/groups.html#-POST). + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Getting Started with the SMTP API]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html) +- [Integrating with SMTP]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html) +- [Building an SMTP Email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html) \ No newline at end of file diff --git a/source/API_Reference/SMTP_API/unique_arguments.md b/source/API_Reference/SMTP_API/unique_arguments.md index 367d2cee6c..d856967630 100644 --- a/source/API_Reference/SMTP_API/unique_arguments.md +++ b/source/API_Reference/SMTP_API/unique_arguments.md @@ -1,7 +1,11 @@ --- -layout: page -weight: 0 +seo: + title: Unique Arguments + description: Add unique arguments to customize your SMTP emails event tracking + keywords: SMTP, unique arguments, email events, email activity title: Unique Arguments +weight: 10 +layout: page navigation: show: true --- @@ -23,7 +27,7 @@ These arguments can be added using a JSON string like this: } {% endcodeblock %} -These arguments can then be seen in posts from the [SendGrid Event Webhook]({{root_url}}/API_Reference/Webhooks/index.html). The contents of one of these POST would look something like this: +These arguments can then be seen in posts from the [SendGrid Event Webhook]({{root_url}}/API_Reference/Webhooks/index.html). The contents of one of these POST requests would look something like this: <h4>Example Webhook Post Data</h4> {% codeblock lang:json %} @@ -32,7 +36,8 @@ These arguments can then be seen in posts from the [SendGrid Event Webhook]({{ro "New Argument 1": "New Value 1", "event": "processed", "New Argument 4": "New Value 4", - "email": "user@example.com", + "email": "useexampexample@example.com", + "email": "example@example.com", "smtp-id": "<145cea24eb8.1c420.57425@localhost.localdomain>", "timestamp": 1399331116, "New Argument 2": "New Value 2", @@ -42,9 +47,7 @@ These arguments can then be seen in posts from the [SendGrid Event Webhook]({{ro } {% endcodeblock %} -{% warning %} There are a few cases where unique_args cannot be attached to the Event. Specifically Bounces that are returned via the Return-Path. Please keep this in mind when developing unique_args POST handling. {% endwarning %} - -Unique Arguments will also be shown in the [Email Activity tab]({{site.app_url}}/email_activity) of your account. +{% warning %}Bounces returned with the Return-Path cause `unique_rgs not to be attached to an event. This can cause issues when developing unique_args POST handling. {% endwarning %} To apply different unique arguments to individual emails, you may use [substitution tags]({{root_url}}/API_Reference/SMTP_API/substitution_tags.html). An example of this would look like: @@ -61,3 +64,12 @@ To apply different unique arguments to individual emails, you may use [substitut } } {% endcodeblock %} + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) +- [Getting Started with the SMTP API]({{root_url}}/API_Reference/SMTP_API/getting_started_smtp.html) +- [Integrating with SMTP]({{root_url}}/API_Reference/SMTP_API/integrating_with_the_smtp_api.html) +- [Building an SMTP Email]({{root_url}}/API_Reference/SMTP_API/building_an_smtp_email.html) diff --git a/source/API_Reference/SMTP_API/using_the_smtp_api.md b/source/API_Reference/SMTP_API/using_the_smtp_api.md deleted file mode 100644 index f71fb13e43..0000000000 --- a/source/API_Reference/SMTP_API/using_the_smtp_api.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -layout: page -weight: 950 -title: Using the SMTP API -navigation: - show: true ---- - -You can add as many of the SMTP API methods as you want to a single large JSON string, and pass that JSON string to SendGrid with your messages. To do this, add the JSON string to your message under a header named "X-SMTPAPI" like this: - -{% codeblock lang:json %}{ - "to": [ - "ben@sendgrid.com", - "joe@sendgrid.com" - ], - "sub": { - "%name%": [ - "Ben", - "Joe" - ], - "%role%": [ - "%sellerSection%", - "%buyerSection%" - ] - }, - "section": { - "%sellerSection%": "Seller information for: %name%", - "%buyerSection%": "Buyer information for: %name%" - }, - "category": [ - "Orders" - ], - "unique_args": { - "orderNumber": "12345", - "eventID": "6789" - }, - "filters": { - "footer": { - "settings": { - "enable": 1, - "text/plain": "Thank you for your business" - } - } - }, - "send_at": 1409348513 -} -{% endcodeblock %} - -<p>The above example is formatted for readability. Headers must be wrapped to keep the line length under 72. By <a href="https://tools.ietf.org/html/rfc821">RFC 821</a> no line can be longer than 1,000, so if you are going to generate this string yourself it is a good idea to make sure that you wrap it.</p> - -<p>Here is a full example of generating the above JSON header in a Perl script:</p> - -{% codeblock lang:perl %} - -#!/usr/local/bin/perl -w - -use strict; -use JSON; - -my $header = { to => ['ben@sendgrid.com', 'joe@sendgrid.com'], -sub => { '%name%' => [ 'Ben', 'Joe' ], '%role%' =>[ 'sellerSection', 'buyerSection' ] }, -section => { '%sellerSection%' => 'Seller information for: %name%', '%buyerSection%' => 'Buyer information for: %name%' }, -category => 'Orders', -unique_args => { 'orderNumber' => '12345', 'eventID' => '6789' }, -filters => { 'footer' => {'settings' => {'text/plain' => "Thank you for your business"}}}}; - -my $json = JSON->new; -$json->space_before(1); -$json->space_after(1); -my $js = $json->encode($header); -# This regex breaks the string up at whitespaces to keep the line length short -$js =~ s/(.{1,72})(\s)/$1\n   /g; -my $hdr = "X-SMTPAPI: $js"; -print "$hdr\n"; -{% endcodeblock %} -{% anchor h2 %} -Requirements and Limitations -{% endanchor %} - -{% warning %} -While there is a hard limit of 10,000 addresses that can be sent to in a multiple recipient e-mail, it is best to split up large jobs to around 1,000 recipients, to better allow for the processing load to be distributed. Furthermore, if you have a large number of additional substitions or sections in the headers, it is best to split the send into even smaller groups. -{% endwarning %} - -<p>When using the X-SMTPAPI to send to multiple recipients, you cannot use the standard SMTP protocols "TO" field to send to multiple recipients because doing so can generate duplicate messages to the addresses listed in both. - -For more information on this, read <a href="http://tools.ietf.org/html/rfc821"> RFC 821</a>. -</p> - -<p>Ensure that the header is limited to a maximum total line length of 1,000 characters. Failure to do this can cause intermediate MTA's to split the header on non-space boundaries, which will cause spaces to be inserted in the final resulting e-mail. Additionally, if your e-mail is going through another MTA before reaching SendGrid, it is likely to have an even lower setting for maximum header length and may truncate the header.</p> - -<p>When using the API, if our system encounters a parsing error the message will be bounced to the address specified in the MAIL FROM portion of the SMTP session. The MAIL FROM address is re-written when we send e-mail out for final delivery, so it is safe to set this to an address that can receive the bounces so that you will be alerted to any errors. More info: <a href="{{site.support_url}}/hc/en-us/articles/200181478-How-to-set-up-bounce-forwarding-to-go-to-the-email-s-FROM-address"></a>Bounce Forwarding</a> </p> - -{% anchor h2 %} -Sending Unicode in the SMTP API -{% endanchor %} - -When sending unicode characters via the SMTP API, you should escape these characters using the ```\u``` escape character. When you do this, unicode characters like ``` á``` becomes ```\u00E1```. To see a list of unicode characters in the Wikipedia's [Unicode Article](http://en.wikipedia.org/wiki/List_of_Unicode_characters). diff --git a/source/API_Reference/Web_API/Customer_Subuser_API/account_limits.md b/source/API_Reference/Web_API/Customer_Subuser_API/account_limits.md index 98a41b8969..8c0320bf84 100644 --- a/source/API_Reference/Web_API/Customer_Subuser_API/account_limits.md +++ b/source/API_Reference/Web_API/Customer_Subuser_API/account_limits.md @@ -81,8 +81,8 @@ A recurring reset will allow you to periodically reset a subusers credits to a n {% parameter 'user' 'Yes' 'Subuser must be under your account' 'The subuser you will be applying a recurring credit limit to' %} {% parameter 'credits' 'Yes' 'Unsigned integer' 'The number of credits the subuser will be reset to' %} {% parameter 'period' 'Yes' 'Must be either daily, weekly, or monthly' 'How often you want SendGrid to reset the subuser credits' %} - {% parameter 'startdate' 'No' 'Date must be in <code>YYY-mm-dd</code> format' 'The date you want to start resetting the subuser credits' %} - {% parameter 'enddate' 'No' 'Date must be in <code>YYY-mm-dd</code> format' 'The date you want to stop resetting the subusers credits. After this date, credits will not be added to the account, but can still be consumed' %} + {% parameter 'startdate' 'No' 'Date must be in <code>YYYY-mm-dd</code> format' 'The date you want to start resetting the subuser credits' %} + {% parameter 'enddate' 'No' 'Date must be in <code>YYYY-mm-dd</code> format' 'The date you want to stop resetting the subusers credits. After this date, credits will not be added to the account, but can still be consumed' %} {% parameter 'initial_credits' 'No' 'Unsigned integer' 'The number of credits you initially want the account reset to. If this is not set, the credits will be reset using the credits parameter. Useful when setting up a subuser with partially-consumed credits' %} {% endparameters %} diff --git a/source/API_Reference/Web_API/Customer_Subuser_API/apps.md b/source/API_Reference/Web_API/Customer_Subuser_API/apps.md index 929ec4bd82..16c594a854 100644 --- a/source/API_Reference/Web_API/Customer_Subuser_API/apps.md +++ b/source/API_Reference/Web_API/Customer_Subuser_API/apps.md @@ -54,7 +54,7 @@ List all of the available apps available for the subuser. <app> <name>subscriptiontrack</name> <title>Subscription Tracking - Adds unsubscribe links to the bottom of the text and HTML emails. Future emails won't be delivered to unsubscribed users. + Adds unsubscribe links to the bottom of the text and HTML emails. Future emails won't be delivered to unsubscribed users. 0 diff --git a/source/API_Reference/Web_API/Customer_Subuser_API/invalid_emails.md b/source/API_Reference/Web_API/Customer_Subuser_API/invalid_emails.md index 1c786cc639..d46d9a7fa2 100644 --- a/source/API_Reference/Web_API/Customer_Subuser_API/invalid_emails.md +++ b/source/API_Reference/Web_API/Customer_Subuser_API/invalid_emails.md @@ -20,7 +20,7 @@ Retrieve Invalid Emails {% response json %} [ { - "email": "isaac@hotmail.comm", + "email": "example@example.com", "reason": "Mail domain mentioned in email address is unknown", "created": "2009-06-01 19:41:39" }, @@ -30,7 +30,7 @@ Retrieve Invalid Emails "created": "2009-06-01 19:41:39" }, { - "email": "isaac@example.com", + "email": "example@example.com", "reason": "Known bad domain", "created": "2009-06-01 19:41:39" } @@ -39,7 +39,7 @@ Retrieve Invalid Emails {% response xml %} - isaac@hotmail.comm + example@example.com Mail domain mentioned in email address is unknown 2009-06-10 12:40:30 @@ -49,7 +49,7 @@ Retrieve Invalid Emails 2009-06-10 12:40:30 - isaac@example.com + example@example.com Known bad domain 2009-06-10 12:40:30 diff --git a/source/API_Reference/Web_API/Customer_Subuser_API/monitor_records.md b/source/API_Reference/Web_API/Customer_Subuser_API/monitor_records.md index 356027cbf4..1307a69c5c 100644 --- a/source/API_Reference/Web_API/Customer_Subuser_API/monitor_records.md +++ b/source/API_Reference/Web_API/Customer_Subuser_API/monitor_records.md @@ -8,7 +8,7 @@ navigation: Monitor records will send samples from one or more subusers at a frequency you set. -The first step is to create a Monitor Record. Once the monitor record has been created, you can append asubuser to a monitor record. Multiple subusers can be appended to a single monitor record. +The first step is to create a Monitor Record. Once the monitor record has been created, you can append a subuser to a monitor record. Multiple subusers can be appended to a single monitor record. {% anchor h2 %} Create Monitor Record @@ -122,7 +122,7 @@ List all available monitor records on your account. "frequency": "10000", "users": [ "user1@example.com", - "user2@example.com" + "exampexample@example.comom" ] } ] @@ -141,7 +141,7 @@ List all available monitor records on your account. 10000 user1@example.com - user2@example.com + exampexample@example.comom diff --git a/source/API_Reference/Web_API/Customer_Subuser_API/subuser_bounces.md b/source/API_Reference/Web_API/Customer_Subuser_API/subuser_bounces.md index 29317fe3dd..1e2381a341 100644 --- a/source/API_Reference/Web_API/Customer_Subuser_API/subuser_bounces.md +++ b/source/API_Reference/Web_API/Customer_Subuser_API/subuser_bounces.md @@ -20,13 +20,13 @@ Retrieve Bounces {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "status": "5.1.1", - "reason": "550 5.1.1 unknown or illegal user: email1@domain.com", + "reason": "550 5.1.1 unknown or illegal user: emaieexampexample@example.com", "created": "2014-12-06 08:34:48" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "status": "5.1.1", "reason": "550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at http:\/\/support.google.com\/mail\/bin\/answer.py?answer=6596 qy3si50924603pab.12 - gsmtp ", "created": "2014-12-06 08:36:34" @@ -36,13 +36,13 @@ Retrieve Bounces {% response xml %} - email1@domain.com + emaieexampexample@example.com 5.1.1 - 550 5.1.1 unknown or illegal user: email1@domain.com + 550 5.1.1 unknown or illegal user: emaieexampexample@example.com 2014-12-06 08:34:48 - email2@domain2.com + emaileexampexample@example.com 5.1.1 550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at http:\/\/support.google.com\/mail\/bin\/answer.py?answer=6596 qy3si50924603pab.12 - gsmtp 2014-12-06 08:36:34 @@ -65,7 +65,7 @@ SendGrid suppresses messages to bounced addresses, but entries can be removed fr {% parameter email Yes 'Address exists on the list' 'Address to remove from the Bounce suppression list' %} {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/api/user.bounces api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=subuser_username&task=delete&email=bounce@example.com %} +{% apiexample delete POST https://api.sendgrid.com/api/user.bounces api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=subuser_username&task=delete&email=bounceexampexample@example.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Customer_Subuser_API/subuser_spam_reports.md b/source/API_Reference/Web_API/Customer_Subuser_API/subuser_spam_reports.md index a69e3971e9..e51ed792f4 100644 --- a/source/API_Reference/Web_API/Customer_Subuser_API/subuser_spam_reports.md +++ b/source/API_Reference/Web_API/Customer_Subuser_API/subuser_spam_reports.md @@ -23,11 +23,11 @@ Retrieve Spam Reports {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -35,11 +35,11 @@ Retrieve Spam Reports {% response xml %} - email1@domain.com + emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 2009-06-10 12:40:30 diff --git a/source/API_Reference/Web_API/Customer_Subuser_API/subuser_unsubscribes.md b/source/API_Reference/Web_API/Customer_Subuser_API/subuser_unsubscribes.md index a2d4d417e2..1f16ee0d2d 100644 --- a/source/API_Reference/Web_API/Customer_Subuser_API/subuser_unsubscribes.md +++ b/source/API_Reference/Web_API/Customer_Subuser_API/subuser_unsubscribes.md @@ -20,11 +20,11 @@ Retrieve Unsubscribes {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -32,11 +32,11 @@ Retrieve Unsubscribes {% response xml %} - email1@domain.com + emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 2009-06-10 12:40:30 @@ -53,7 +53,7 @@ SendGrid suppresses messages to unsubscribed addresses, but entries can be remov {% parameters delete %} {% parameter task Yes 'Must be set to delete' 'Task to remove unsubscribed address from subuser' %} - {% parameter user Yes 'Subuser must be under your account' 'Subuser to remove unsubsribed address from' %} + {% parameter user Yes 'Subuser must be under your account' 'Subuser to remove unsubscribed address from' %} {% parameter email Yes 'Address exists on the list' 'Address to remove from the Unsubscribe suppression list' %} {% endparameters %} diff --git a/source/API_Reference/Web_API/Customer_Subuser_API/subusers.md b/source/API_Reference/Web_API/Customer_Subuser_API/subusers.md index b9b392050e..8edc9f9de3 100644 --- a/source/API_Reference/Web_API/Customer_Subuser_API/subusers.md +++ b/source/API_Reference/Web_API/Customer_Subuser_API/subusers.md @@ -186,7 +186,7 @@ Update Subuser Username {% endanchor %} {% warning %} -Subuser username is used to access website and API. Changes occur immediately. For instructions on how to use [Teammates]({{root_url}}/User_Guide/Settings/teammates.html) to safely alter login credentials without access downtime, click [here]({{root_url}}/Classroom/Basics/Account/resetting_your_password_without_breaking_current_integrations.html). +Subuser username is used to access website and API. Changes occur immediately. {% endwarning %} {% parameters updateSubuserUsername %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/invalid_emails.md b/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/invalid_emails.md index e09fcc7932..28c51b6f1d 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/invalid_emails.md +++ b/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/invalid_emails.md @@ -64,7 +64,7 @@ This feature is deprecated, please go to the 2009-06-10 12:40:30 - isaac@example.com + example@example.com Known bad domain 2009-06-10 12:40:30 @@ -101,7 +101,7 @@ This feature is deprecated, please go to the task Yes Must be set to *delete* - This will allow you to delete a invalid email for the specified subuser + This will allow you to delete an invalid email for the specified subuser email No - Must be a invalid email + Must be an invalid email You must specify the invalid emails to remove diff --git a/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_bounces.md b/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_bounces.md index dee2550e8b..b268ec1a1b 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_bounces.md +++ b/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_bounces.md @@ -70,15 +70,15 @@ Note that you can use *either* the days parameter *or* the start_date and end_da - email1@domain.com + emaieexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com 2009-06-10 12:40:30 @@ -104,15 +104,15 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% codeblock lang:json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "status": "5.1.1", - "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com", + "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "status": "5.1.1", - "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com", + "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -168,7 +168,7 @@ Since SendGrid does not re-deliver to bounced addresses, users can remove bounce {% requesturl POST %}https://api.sendgrid.com/api/user.bounces.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=example@example.com&task=delete&email=bounce@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=example@example.com&task=delete&email=bounceexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -204,7 +204,7 @@ Since SendGrid does not re-deliver to bounced addresses, users can remove bounce {% requesturl POST %}https://api.sendgrid.com/api/user.bounces.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=example@example.com&task=delete&email=bounce@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=example@example.com&task=delete&email=bounceexampexample@example.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_spam_reports.md b/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_spam_reports.md index b15a91434b..fe6a8ce4c2 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_spam_reports.md +++ b/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_spam_reports.md @@ -69,11 +69,11 @@ Retrieve Spam Reports - email1@domain.com + emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 2009-06-10 12:40:30 @@ -99,11 +99,11 @@ Retrieve Spam Reports {% codeblock lang:json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] diff --git a/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_unsubscribes.md b/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_unsubscribes.md index c580326b62..6b552d074c 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_unsubscribes.md +++ b/source/API_Reference/Web_API/Legacy_Features/Customer_Subuser_API/v1_(deprecated)/subuser_unsubscribes.md @@ -69,11 +69,11 @@ Note that you can use *either* the days parameter *or* the start_date and end_da - email1@domain.com + emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 2009-06-10 12:40:30 @@ -99,11 +99,11 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% codeblock lang:json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] diff --git a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/emails.md b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/emails.md index e4734818cc..799c4d9286 100755 --- a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/emails.md +++ b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/emails.md @@ -99,7 +99,7 @@ curl --request GET \ "recipients": [ { "created_at": 1422313607, - "email": "jones@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBh", "last_clicked": null, @@ -209,7 +209,7 @@ curl --request GET \ "recipients": [ { "created_at": 1422313607, - "email": "jones@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBh", "last_clicked": null, @@ -323,7 +323,7 @@ curl --request GET \ "recipients": [ { "created_at": 1422313607, - "email": "jones@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBh", "last_clicked": null, @@ -342,7 +342,7 @@ curl --request GET \ }, { "created_at": 1432313607, - "email": "jones2@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBhx", "last_clicked": null, @@ -593,7 +593,7 @@ curl --request GET \ "recipients": [ { "created_at": 1422313607, - "email": "jones@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBh", "last_clicked": null, @@ -612,7 +612,7 @@ curl --request GET \ }, { "created_at": 1432313607, - "email": "jones2@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBhx", "last_clicked": null, diff --git a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/marketing_emails.md b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/marketing_emails.md index ea5d50dcae..b795c40d72 100755 --- a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/marketing_emails.md +++ b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/marketing_emails.md @@ -71,7 +71,7 @@ curl --request GET \ "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", diff --git a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/recipients.md b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/recipients.md index cf0fb5c122..21d6e97278 100755 --- a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/recipients.md +++ b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/recipients.md @@ -278,7 +278,7 @@ curl --request GET \ {% anchor h3 %} -Remove assigned ists from a Marketing Email +Remove assigned lists from a Marketing Email {% endanchor %} {% anchor h4 %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/sender_address.md b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/sender_address.md index 864aac21f6..368dd4692f 100755 --- a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/sender_address.md +++ b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/Migration/sender_address.md @@ -143,7 +143,7 @@ curl --request GET \ "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", @@ -264,7 +264,7 @@ curl --request GET \ "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", @@ -338,7 +338,7 @@ curl --request GET \ "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", @@ -412,7 +412,7 @@ curl --request GET \ "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", diff --git a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/emails.md b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/emails.md index cfab244cc4..f1da1ea613 100755 --- a/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/emails.md +++ b/source/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/emails.md @@ -52,7 +52,7 @@ Add an email recipient to a list: -d 'api_user=your_sendgrid_username' \ -d 'api_key=your_sendgrid_password' \ -d 'list=my_list' \ - -d 'data={"email":"address@domain.com","name":"contactName"}'{% endcodeblock %} + -d 'data={"email":"example@example.com","name":"contactName"}'{% endcodeblock %} Add an email recipient with multiple data fields: @@ -60,7 +60,7 @@ Add an email recipient with multiple data fields: -d 'api_user=your_sendgrid_username' \ -d 'api_key=your_sendgrid_password' \ -d 'list=my_list' \ - -d 'data={"email":"grouch@trashcan.com","name":"Oscar","city":"New York","street":"123 Sesame St"}'{% endcodeblock %} + -d 'data={"email":"example@example.com","name":"Oscar","city":"New York","street":"123 Sesame St"}'{% endcodeblock %} Add multiple email recipients to a list: @@ -68,7 +68,7 @@ Add multiple email recipients to a list: -d 'api_user=your_sendgrid_username' \ -d 'api_key=your_sendgrid_password' \ -d 'list=my_list' \ - -d 'data[]={"email":"address1@domain.com","name":"contactName1"}' \ + -d 'data[]={"email":"addresseexampexample@example.com","name":"contactName1"}' \ -d 'data[]={"email":"address2@domain.com","name":"contactName2"}'{% endcodeblock %} * * * * * @@ -92,7 +92,7 @@ Get the email addresses and associated fields for a Recipient List. {% response json %} [ { - "email": "dominic.may@sendgrid.com", + "email": "example@example.com", "name": "" } ] @@ -100,7 +100,7 @@ Get the email addresses and associated fields for a Recipient List. {% response xml %} - dominic.may@sendgrid.com + example@example.com diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/account_overview.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/account_overview.md index f214b20cb9..6b0343d119 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/account_overview.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/account_overview.md @@ -9,7 +9,7 @@ navigation: --- {% warning %} -This feature is deprecated, please go to the [Version 2]({{root_url}}/API_Reference/Web_API/Reseller_API/account_overview.html) Reseller Account Overview page. +This feature is deprecated, please go to the [Version 2]({{root_url}}/API_Reference/Web_API/Reseller_API/account_overview.html) Reseller Account Overview page. {% endwarning %} View general account information regarding your customers, including billing cycle, current billing cycle, credit usage, package, overage credits, etc. @@ -44,7 +44,7 @@ View general account information regarding your customers, including billing cyc {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=overview&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=overview&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -95,7 +95,7 @@ View general account information regarding your customers, including billing cyc {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=overview&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=overview&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/apps.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/apps.md index 07c0487045..2697b903ec 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/apps.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/apps.md @@ -64,7 +64,7 @@ Note: The *name* entry is used in all the other API calls to identify a app. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=getavailable&method=apps&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=getavailable&method=apps&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -84,7 +84,7 @@ Note: The *name* entry is used in all the other API calls to identify a app. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=getavailable&method=apps&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=getavailable&method=apps&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -143,7 +143,7 @@ Activate App {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=activate&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=activate&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -160,7 +160,7 @@ Activate App {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=activate&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=activate&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -223,7 +223,7 @@ Deactivate App {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=deactivate&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=deactivate&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -240,7 +240,7 @@ Deactivate App {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=deactivate&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=deactivate&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -268,7 +268,7 @@ These API calls require that settings are passed using POST. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=setup&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=setup&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -299,7 +299,7 @@ This is returned if that filter has no settings or is not enabled. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=setup&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&method=apps&task=setup&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -336,7 +336,7 @@ Get Current Settings {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&task=getsettings&user=customer@example.com&method=app + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=twitter&task=getsettings&user=eexampexample@example.com&method=app {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/authenticate_a_customer.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/authenticate_a_customer.md index 9a1a39e13e..d9e924dd8f 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/authenticate_a_customer.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/authenticate_a_customer.md @@ -9,7 +9,7 @@ navigation: --- {% warning %} -This feature is deprecated, please go to the [Version 2]({{root_url}}/API_Reference/Web_API/Reseller_API/authenticate_a_customer.html) Reseller Authenticate a Customer page. +This feature is deprecated, please go to the [Version 2]({{root_url}}/API_Reference/Web_API/Reseller_API/authenticate_a_customer.html) Reseller Authenticate a Customer page. {% endwarning %} @@ -54,7 +54,7 @@ Authenticate a customer on your website before displaying their account informat {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=customer@example.com&password=theirsubmittedpassword&method=aut + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=eexampexample@example.com&password=theirsubmittedpassword&method=aut {% endrequestdata %} {% endrequestblock %} @@ -84,7 +84,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=customer@example.com&password=theirsubmittedpassword&method=aut + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=eexampexample@example.com&password=theirsubmittedpassword&method=aut {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing.md index 8c7dc06185..71b81a8937 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing.md @@ -14,7 +14,7 @@ navigation: You can retrieve invoices and usage data about your users through the website or via the Distributor API. -Whenever you create an user under your account, they immediately begin their billing cycle from that day forward. The billing cycle is one month, and they will be invoiced the same day the account was created the following month. +Whenever you create a user under your account, they immediately begin their billing cycle from that day forward. The billing cycle is one month, and they will be invoiced the same day the account was created the following month. If a user decides to close their account during their billing period, we will prorate the amount left on the next bill. diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_as_you_go_usage.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_as_you_go_usage.md index 7d149653ab..4af0efde18 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_as_you_go_usage.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_as_you_go_usage.md @@ -50,7 +50,7 @@ Retrieve invoices/usages from end users before your scheduled billing date. ### Response {% codeblock %} -usage>2010010001001234562010-09-01 00:00:00Unpaid10016.95Recurring Bill02010-08-012010-08-31user4@example.comExample Package01007.952010010001001234562010-09-01 00:00:00Unpaid10016.95Recurring Bill02010-08-012010-08-31example@example.comExample Package01007.95JSON Call @@ -68,6 +68,6 @@ usage>201001000100123456< {% codeblock %} {"number":"201001000100","credits":"123456","date_invoiced":"2010-09-01 00:00:00","status":"Unpaid","amount":1001,"overage":6.95,"type":"Recurring -Bill","prorated":0,"start_date":"2010-08-01","end_date":"2010-08-31","username":"user4@example.com","package":"Example +Bill","prorated":0,"start_date":"2010-08-01","end_date":"2010-08-31","username":"example@example.com","package":"Example Package","additional_charges":0,"final_amount":1007.95} {% endcodeblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_end_users_invoices_usage.html b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_end_users_invoices_usage.html index ad74892f6e..774102287a 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_end_users_invoices_usage.html +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/billing_retrieving_end_users_invoices_usage.html @@ -38,7 +38,7 @@

Response

{% codeblock %} -usage>20100100012010010001001234562010-09-01 00:00:00Unpaid10016.95Recurring Bill02010-08-012010-08-31user4@example.comExample Package01007.9520100100020013332010-09-05 00:00:00Unpaid13.950Recurring Bill02010-08-012010-08-31user5@example.comExample Package013.9520100100012010010001001234562010-09-01 00:00:00Unpaid10016.95Recurring Bill02010-08-012010-08-31example@example.comExample Package01007.9520100100020013332010-09-05 00:00:00Unpaid13.950Recurring Bill02010-08-012010-08-31user5@example.comExample Package013.95Response: Error {% codeblock lang:xml %} @@ -62,7 +62,7 @@

Response

"number":"2010010001","invoices": [{"number":"201001000100","credits":"123456","date_invoiced":"2010-09-01 00:00:00","status":"Unpaid","amount":1001,"overage":6.95,"type":"Recurring -Bill","prorated":0,"start_date":"2010-08-01","end_date":"2010-08-31","username":"user4@example.com","package":"Example +Bill","prorated":0,"start_date":"2010-08-01","end_date":"2010-08-31","username":"example@example.com","package":"Example Package","additional_charges":0,"final_amount":1007.95},{"number":"201001000200","credits":"1333","date_invoiced":"2010-09-05 00:00:00","status":"Unpaid","amount":13.95,"overage":0,"type":"Recurring Bill","prorated":0,"start_date":"2010-08-01","end_date":"2010-08-31","username":"user5@example.com","package":"Example diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_account_limits.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_account_limits.md index 13709ff9b6..4943a9b316 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_account_limits.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_account_limits.md @@ -57,7 +57,7 @@ Retrieve account limits for a specific customer. If the API call response is emp {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=retriev + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=retriev {% endrequestdata %} {% endrequestblock %} @@ -96,7 +96,7 @@ Retrieve account limits for a specific customer. If the API call response is emp {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=retriev + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=retriev {% endrequestdata %} {% endrequestblock %} @@ -169,7 +169,7 @@ Obtain a complete list of all customer. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=non + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=non {% endrequestdata %} {% endrequestblock %} @@ -199,7 +199,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=non + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=non {% endrequestdata %} {% endrequestblock %} @@ -305,7 +305,7 @@ A recurring reset will allow you to periodically reset a subusers credits to a n {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=recurring&credits=200&period=dail + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=recurring&credits=200&period=dail {% endrequestdata %} {% endrequestblock %} @@ -335,7 +335,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=recurring&credits=200&period=dail + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=recurring&credits=200&period=dail {% endrequestdata %} {% endrequestblock %} @@ -417,7 +417,7 @@ Set a subusers credits to a specified amount. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=total&credits=20 + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=total&credits=20 {% endrequestdata %} {% endrequestblock %} @@ -447,7 +447,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=total&credits=20 + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=total&credits=20 {% endrequestdata %} {% endrequestblock %} @@ -529,7 +529,7 @@ Increment a subusers credits by a specified amount. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=increment&credits=20 + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=increment&credits=20 {% endrequestdata %} {% endrequestblock %} @@ -559,7 +559,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=increment&credits=20 + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=increment&credits=20 {% endrequestdata %} {% endrequestblock %} @@ -641,7 +641,7 @@ Decrement a subusers credits by a specified amount. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=decrement&credits=20 + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=decrement&credits=20 {% endrequestdata %} {% endrequestblock %} @@ -671,7 +671,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=decrement&credits=20 + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=decrement&credits=20 {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_bounces.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_bounces.md index 77ca05ca96..52ea958537 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_bounces.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_bounces.md @@ -68,7 +68,7 @@ Note that you can use *either* the days parameter *or* the start_date and end_da ### Call {% codeblock %} -https://api.sendgrid.com/apiv2/reseller.manage.xml?api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=customer@example.com&task=get&date= +https://api.sendgrid.com/apiv2/reseller.manage.xml?api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=eexampexample@example.com&task=get&date= {% endcodeblock %}

Response

{% codeblock lang:xml %} @@ -76,15 +76,15 @@ https://api.sendgrid.com/apiv2/reseller.manage.xml?api_user=your_sendgrid_userna - email1@domain.com + emaieexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com 2009-06-10 12:40:30 @@ -96,22 +96,22 @@ https://api.sendgrid.com/apiv2/reseller.manage.xml?api_user=your_sendgrid_userna ### Call {% codeblock %} -https://api.sendgrid.com/apiv2/reseller.manage.json?api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=customer@example.com&task=get&date= +https://api.sendgrid.com/apiv2/reseller.manage.json?api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=eexampexample@example.com&task=get&date= {% endcodeblock %}

Response

{% codeblock lang:json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "status": "5.1.1", - "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com", + "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "status": "5.1.1", - "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com", + "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -178,7 +178,7 @@ Since SendGrid does not re-deliver to bounced addresses, users can remove bounce ### Call {% codeblock %} -https://api.sendgrid.com/apiv2/reseller.manage.xml?api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=customer@example.com&task=delete&email=bounce@example.com +https://api.sendgrid.com/apiv2/reseller.manage.xml?api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=eexampexample@example.com&task=delete&email=bounceexampexample@example.com {% endcodeblock %}

Response: Success

{% codeblock lang:xml %} @@ -206,7 +206,7 @@ https://api.sendgrid.com/apiv2/reseller.manage.xml?api_user=your_sendgrid_userna ### Call {% codeblock %} -https://api.sendgrid.com/apiv2/reseller.manage.json?api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=customer@example.com&task=delete&email=bounce@example.com +https://api.sendgrid.com/apiv2/reseller.manage.json?api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=eexampexample@example.com&task=delete&email=bounceexampexample@example.com {% endcodeblock %}

Response: Success

diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_invalid_emails.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_invalid_emails.md index ba82770898..fe665fe0c6 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_invalid_emails.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_invalid_emails.md @@ -66,7 +66,7 @@ Retrieve Invalid Emails {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=customer@example.com&task=get&date= + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=eexampexample@example.com&task=get&date= {% endrequestdata %} {% endrequestblock %} @@ -74,7 +74,7 @@ Retrieve Invalid Emails ### Response {% codeblock %} -invalidemails>isaac@hotmail.commMail domain mentioned in email address is unknown2009-06-10 12:40:30isaac@hotmailBad Syntax2009-06-10 12:40:30isaac@example.comKnown bad domain2009-06-10 12:40:30
example@example.comMail domain mentioned in email address is unknown2009-06-10 12:40:30isaac@hotmailBad Syntax2009-06-10 12:40:30example@example.comKnown bad domain2009-06-10 12:40:30JSON Call @@ -83,14 +83,14 @@ invalidemails>isaac@hotmail.commMail domain {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=customer@example.com&task=get&date= + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=eexampexample@example.com&task=get&date= {% endrequestdata %} {% endrequestblock %}

Response

{% codeblock %} -{"email":"isaac@hotmail.comm","reason":"Mail domain mentioned in email address is unknown","created":"2009-06-01 19:41:39"},{"email":"isaac@hotmail","reason":"Bad Syntax","created":"2009-06-01 19:41:39"},{"email":"isaac@example.com","reason":"Known bad domain","created":"2009-06-01 19:41:39"} +{"email":"example@example.com","reason":"Mail domain mentioned in email address is unknown","created":"2009-06-01 19:41:39"},{"email":"isaac@hotmail","reason":"Bad Syntax","created":"2009-06-01 19:41:39"},{"email":"example@example.com","reason":"Known bad domain","created":"2009-06-01 19:41:39"} {% endcodeblock %} * * * * * @@ -124,12 +124,12 @@ Since SendGrid does not deliver to invalid emails, users can remove invalid emai Must be set to delete - This will allow you to delete a invalid email for the specified customer + This will allow you to delete an invalid email for the specified customer email No - Must be a invalid email + Must be an invalid email You must specify the invalid emails to remove @@ -151,7 +151,7 @@ Since SendGrid does not deliver to invalid emails, users can remove invalid emai {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=customer@example.com&task=delete&email=invalidemail@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=eexampexample@example.com&task=delete&email=invalidemail@example.com {% endrequestdata %} {% endrequestblock %} @@ -173,7 +173,7 @@ result>Email does not exist {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=customer@example.com&task=delete&email=invalidemail@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=eexampexample@example.com&task=delete&email=invalidemail@example.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_management.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_management.md index 8994370ba1..4096d68ca7 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_management.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_management.md @@ -160,7 +160,7 @@ Create a Customer {% requesturl POST %}https://api.sendgrid.com/api/distributor.add.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&username=newcustomer@example.com&website=example.com&password=samplepassword&confirm_password=samplepassword&first_name=fname&last_name=lname&address=555_anystreet&city=any_city&state=CA&zip=91234&email=newcustomer@example.com&country=US&phone=555-555&free_user=tru + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&username=neweexampexample@example.com&website=example.com&password=samplepassword&confirm_password=samplepassword&first_name=fname&last_name=lname&address=555_anystreet&city=any_city&state=CA&zip=91234&email=neweexampexample@example.com&country=US&phone=555-555&free_user=tru {% endrequestdata %} {% endrequestblock %} @@ -199,7 +199,7 @@ Create a Customer {% requesturl POST %}https://api.sendgrid.com/api/distributor.add.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&username=newcustomer@example.com&website=example.com&password=samplepassword&confirm_password=samplepassword&first_name=fname&last_name=lname&address=555_anystreet&city=any_city&state=CA&zip=91234&email=newcustomer@example.com&country=US&phone=555-55 + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&username=neweexampexample@example.com&website=example.com&password=samplepassword&confirm_password=samplepassword&first_name=fname&last_name=lname&address=555_anystreet&city=any_city&state=CA&zip=91234&email=neweexampexample@example.com&country=US&phone=555-55 {% endrequestdata %} {% endrequestblock %} @@ -259,7 +259,7 @@ This is the same thing as closing out a customers account at the end of their bi {% requesturl POST %}https://api.sendgrid.com/api/distributor.delete.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -298,7 +298,7 @@ This is the same thing as closing out a customers account at the end of their bi {% requesturl POST %}https://api.sendgrid.com/api/distributor.delete.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -500,7 +500,7 @@ Enable a customer so they may start sending out emails again. This call will not {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=enable&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=enable&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -534,7 +534,7 @@ Enable a customer so they may start sending out emails again. This call will not {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=enable&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=enable&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -598,7 +598,7 @@ This prevents them from sending out emails with SendGrid. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=disable&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=disable&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -696,7 +696,7 @@ Allow a customer to login to the SendGrid.com website. This call will not enable {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_enable&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_enable&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -730,7 +730,7 @@ Allow a customer to login to the SendGrid.com website. This call will not enable {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_enable&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_enable&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -794,7 +794,7 @@ Disallow a customer to login to the SendGrid.com website. This call will not pre {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_disable&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_disable&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -948,7 +948,7 @@ Allows you to update your customers profile information {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=set&user=customer@example.com&first_name=newFirstName&last_name=&newLastNam + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=set&user=eexampexample@example.com&first_name=newFirstName&last_name=&newLastNam {% endrequestdata %} {% endrequestblock %} @@ -987,7 +987,7 @@ Allows you to update your customers profile information {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=set&user=customer@example.com&first_name=newFirstName&last_name=&newLastNam + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=set&user=eexampexample@example.com&first_name=newFirstName&last_name=&newLastNam {% endrequestdata %} {% endrequestblock %} @@ -1066,7 +1066,7 @@ Passwords are encrypted by default and therefore cannot be retrieved; however, y {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=password&user=customer@example.com&password=newPasword&confirm_password=newPasswor + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=password&user=eexampexample@example.com&password=newPasword&confirm_password=newPasswor {% endrequestdata %} {% endrequestblock %} @@ -1105,7 +1105,7 @@ Passwords are encrypted by default and therefore cannot be retrieved; however, y {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=password&user=customer@example.com&password=newPasword&confirm_password=newPasswor + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=password&user=eexampexample@example.com&password=newPasword&confirm_password=newPasswor {% endrequestdata %} {% endrequestblock %} @@ -1195,7 +1195,7 @@ Note that your customer account username is used to login to our SMTP server *an {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setUsername&user=customer@example.com&username=newcustomer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setUsername&user=eexampexample@example.com&username=neweexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -1234,7 +1234,7 @@ Note that your customer account username is used to login to our SMTP server *an {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setUsername&user=customer@example.com&username=newcustomer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setUsername&user=eexampexample@example.com&username=neweexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -1316,7 +1316,7 @@ This is the contact email we use for your customers. Changes take place immediat {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setEmail&user=customer@example.com&email=newcustomer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setEmail&user=eexampexample@example.com&email=neweexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -1355,7 +1355,7 @@ This is the contact email we use for your customers. Changes take place immediat {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setEmail&user=customer@example.com&email=newcustomer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setEmail&user=eexampexample@example.com&email=neweexampexample@example.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_spam_reports.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_spam_reports.md index 25734e5e3c..876e896169 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_spam_reports.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_spam_reports.md @@ -66,7 +66,7 @@ Retrieve Spam Reports {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=customer@example.com&task=get&date= + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=eexampexample@example.com&task=get&date= {% endrequestdata %} {% endrequestblock %} @@ -74,7 +74,7 @@ Retrieve Spam Reports ### Response {% codeblock %} -spamreports>email1@domain.com2009-06-10 12:40:30email2@domain2.com2009-06-10 12:40:30emaieexampexample@example.com2009-06-10 12:40:30emaileexampexample@example.com2009-06-10 12:40:30JSON Call @@ -83,14 +83,14 @@ spamreports>email1@domain.com2009-06-10 12:4 {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=customer@example.com&task=get&date= + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=eexampexample@example.com&task=get&date= {% endrequestdata %} {% endrequestblock %}

Response

{% codeblock %} -{"email":"email1@domain.com","created":"2009-06-01 19:41:39"},{"email":"email2@domain2.com","created":"2009-06-01 19:41:39"} +{"email":"emaieexampexample@example.com","created":"2009-06-01 19:41:39"},{"email":"emaileexampexample@example.com","created":"2009-06-01 19:41:39"} {% endcodeblock %} * * * * * @@ -151,7 +151,7 @@ Since SendGrid does not deliver to spam reported addresses, users can remove spa {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=customer@example.com&task=delete&email=spamreport@domain.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=eexampexample@example.com&task=delete&email=spamreport@domain.com {% endrequestdata %} {% endrequestblock %} @@ -173,7 +173,7 @@ result>Email does not exist {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=customer@example.com&task=delete&email=spamreport@domain.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=eexampexample@example.com&task=delete&email=spamreport@domain.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_statistics.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_statistics.md index 5465bf22ea..e426d4f071 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_statistics.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_statistics.md @@ -71,7 +71,7 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -88,7 +88,7 @@ stats>2009-06-201234212123421210223categoryAcategoryB2009-06-20categoryA12342< {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=customer@example.com&start_date=2009-06-20&end_date=2009-06-22&category=category + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=eexampexample@example.com&start_date=2009-06-20&end_date=2009-06-22&category=category {% endrequestdata %} {% endrequestblock %} @@ -363,7 +363,7 @@ stats>2009-06-20categoryA12342< {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=customer@example.com&start_date=2009-06-20&end_date=2009-06-22&category[]=categoryA&category[]=category + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=eexampexample@example.com&start_date=2009-06-20&end_date=2009-06-22&category[]=categoryA&category[]=category {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_bounces.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_bounces.md index 2a4399e108..4ff0b17332 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_bounces.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_bounces.md @@ -63,7 +63,7 @@ Note that you can use *either* the days parameter *or* the start_date and end_da ### Response {% codeblock %} -bounces>email1@domain.com5.1.1host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com2009-06-10 12:40:30email2@domain2.com5.1.1host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com2009-06-10 12:40:30emaieexampexample@example.com5.1.1host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com2009-06-10 12:40:30emaileexampexample@example.com5.1.1host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com2009-06-10 12:40:30JSON Call @@ -79,7 +79,7 @@ bounces>email1@domain.com5.1.1ho

Response

{% codeblock %} -{"email":"email1@domain.com","status":"5.1.1","reason":"host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com","created":"2009-06-01 19:41:39"},{"email":"email2@domain2.com","status":"5.1.1","reason":"host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com","created":"2009-06-01 19:41:39"}] +{"email":"emaieexampexample@example.com","status":"5.1.1","reason":"host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com","created":"2009-06-01 19:41:39"},{"email":"emaileexampexample@example.com","status":"5.1.1","reason":"host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com","created":"2009-06-01 19:41:39"}] {% endcodeblock %} @@ -132,7 +132,7 @@ Since SendGrid does not re-deliver to bounced addresses, users can remove bounce {% requesturl POST %}https://api.sendgrid.com/api/distributor.manageSubuser.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=example@example.com&task=delete&email=bounce@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=example@example.com&task=delete&email=bounceexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -154,7 +154,7 @@ result>Email does not exist {% requesturl POST %}https://api.sendgrid.com/api/distributor.manageSubuser.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=example@example.com&task=delete&email=bounce@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=example@example.com&task=delete&email=bounceexampexample@example.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_invalid_emails.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_invalid_emails.md index 697033e408..b2cedb3006 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_invalid_emails.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_invalid_emails.md @@ -61,7 +61,7 @@ Retrieve Invalid Emails ### Response {% codeblock %} -invalidemails>isaac@hotmail.commMail domain mentioned in email address is unknown2009-06-10 12:40:30isaac@hotmailBad Syntax2009-06-10 12:40:30isaac@example.comKnown bad domain2009-06-10 12:40:30example@example.comMail domain mentioned in email address is unknown2009-06-10 12:40:30isaac@hotmailBad Syntax2009-06-10 12:40:30example@example.comKnown bad domain2009-06-10 12:40:30JSON Call @@ -77,7 +77,7 @@ invalidemails>isaac@hotmail.commMail domain

Response

{% codeblock %} -{"email":"isaac@hotmail.comm","reason":"Mail domain mentioned in email address is unknown","created":"2009-06-01 19:41:39"},{"email":"isaac@hotmail","reason":"Bad Syntax","created":"2009-06-01 19:41:39"},{"email":"isaac@example.com","reason":"Known bad domain","created":"2009-06-01 19:41:39"} +{"email":"example@example.com","reason":"Mail domain mentioned in email address is unknown","created":"2009-06-01 19:41:39"},{"email":"isaac@hotmail","reason":"Bad Syntax","created":"2009-06-01 19:41:39"},{"email":"example@example.com","reason":"Known bad domain","created":"2009-06-01 19:41:39"} {% endcodeblock %} * * * * * @@ -111,12 +111,12 @@ Since SendGrid does not deliver to invalid emails, users can remove invalid emai Must be set to delete - This will allow you to delete a invalid email for the specified customer subuser + This will allow you to delete an invalid email for the specified customer subuser email No - Must be a invalid email + Must be an invalid email You must specify the invalid emails to remove diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_monitor_outgoing_email.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_monitor_outgoing_email.md index 6a335c17ad..faafb6931e 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_monitor_outgoing_email.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_monitor_outgoing_email.md @@ -377,7 +377,7 @@ List all available monitor records a reseller has. ### Response -{% codeblock %} sampleNameAexample@example.com1000sampleNameBexample@example.com10000user1@example.comuser2@example.comsampleNameAexample@example.com1000sampleNameBexample@example.com10000user1@example.comexampexample@example.comomJSON Call @@ -393,7 +393,7 @@ List all available monitor records a reseller has.

Response

{% codeblock %} -{"name":"sampleNameA","email":"example@example.com","frequency":"1000","users":[]},{"name":"sampleNameB","email":"example@example.com","frequency":"10000","users":["user1@example.com","user2@example.com"]} +{"name":"sampleNameA","email":"example@example.com","frequency":"1000","users":[]},{"name":"sampleNameB","email":"example@example.com","frequency":"10000","users":["user1@example.com","exampexample@example.comom"]} {% endcodeblock %} * * * * * diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_spam_reports.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_spam_reports.md index 44f406f75f..9e604d7073 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_spam_reports.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_spam_reports.md @@ -61,7 +61,7 @@ Retrieve Spam Reports ### Response {% codeblock %} -spamreports>email1@domain.com2009-06-10 12:40:30email2@domain2.com2009-06-10 12:40:30emaieexampexample@example.com2009-06-10 12:40:30emaileexampexample@example.com2009-06-10 12:40:30JSON Call @@ -77,7 +77,7 @@ spamreports>email1@domain.com2009-06-10 12:4

Response

{% codeblock %} -{"email":"email1@domain.com","created":"2009-06-01 19:41:39"},{"email":"email2@domain2.com","created":"2009-06-01 19:41:39"} +{"email":"emaieexampexample@example.com","created":"2009-06-01 19:41:39"},{"email":"emaileexampexample@example.com","created":"2009-06-01 19:41:39"} {% endcodeblock %} * * * * * diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_unsubscribes.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_unsubscribes.md index 8353232460..d78db72275 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_unsubscribes.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_subuser_unsubscribes.md @@ -56,7 +56,7 @@ Note that you can use *either* the days parameter *or* the start_date and end_da ### Response -{% codeblock %} email1@domain.com2009-06-10 12:40:30email2@domain2.com2009-06-10 12:40:30emaieexampexample@example.com2009-06-10 12:40:30emaileexampexample@example.com2009-06-10 12:40:30JSON Call @@ -72,7 +72,7 @@ Note that you can use *either* the days parameter *or* the start_date and end_da

Response

{% codeblock %} -{"email":"email1@domain.com","created":"2009-06-01 19:41:39"},{"email":"email2@domain2.com","created":"2009-06-01 19:41:39"}] +{"email":"emaieexampexample@example.com","created":"2009-06-01 19:41:39"},{"email":"emaileexampexample@example.com","created":"2009-06-01 19:41:39"}] {% endcodeblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_unsubscribes.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_unsubscribes.md index 8d6f53d55a..a9a67dfde9 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_unsubscribes.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/customer_unsubscribes.md @@ -64,7 +64,7 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=get&date= + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=get&date= {% endrequestdata %} {% endrequestblock %} @@ -72,7 +72,7 @@ Note that you can use *either* the days parameter *or* the start_date and end_da ### Response {% codeblock %} -unsubscribes>email1@domain.com2009-06-10 12:40:30email2@domain2.com2009-06-10 12:40:30emaieexampexample@example.com2009-06-10 12:40:30emaileexampexample@example.com2009-06-10 12:40:30JSON Call @@ -81,14 +81,14 @@ unsubscribes>email1@domain.com2009-06-10 12 {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=get&date= + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=get&date= {% endrequestdata %} {% endrequestblock %}

Response

{% codeblock %} -{"email":"email1@domain.com","created":"2009-06-01 19:41:39"},{"email":"email2@domain2.com","created":"2009-06-01 19:41:39"}] +{"email":"emaieexampexample@example.com","created":"2009-06-01 19:41:39"},{"email":"emaileexampexample@example.com","created":"2009-06-01 19:41:39"}] {% endcodeblock %} @@ -141,7 +141,7 @@ Since SendGrid does not deliver to unsubscribe addresses, users can remove unsub {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=delete&email=unsubscribe@sample.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=delete&email=unsubscribe@sample.com {% endrequestdata %} {% endrequestblock %} @@ -163,7 +163,7 @@ result>Email does not exist {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=delete&email=unsubscribe@sample.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=delete&email=unsubscribe@sample.com {% endrequestdata %} {% endrequestblock %} @@ -233,7 +233,7 @@ Add unsubscribe email records to their account if they need to stop sending emai {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=add&email=unsubscribe@sample.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=add&email=unsubscribe@sample.com {% endrequestdata %} {% endrequestblock %} @@ -255,7 +255,7 @@ result>Email already exists {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=add&email=unsubscribe@sample.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=add&email=unsubscribe@sample.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/event_notification_url.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/event_notification_url.md index 938bd35d0d..b071455bec 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/event_notification_url.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/event_notification_url.md @@ -56,7 +56,7 @@ Retrieve {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=get&user=customer@example.com&method=eventpostur + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=get&user=eexampexample@example.com&method=eventpostur {% endrequestdata %} {% endrequestblock %} @@ -72,7 +72,7 @@ Retrieve {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=get&user=customer@example.com&method=eventpostur + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=get&user=eexampexample@example.com&method=eventpostur {% endrequestdata %} {% endrequestblock %} @@ -138,7 +138,7 @@ Update / Set URL {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=set&user=customer@example.com&url=http://www.SubUserPostUrlHere.com&method=eventpostur + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=set&user=eexampexample@example.com&url=http://www.SubUserPostUrlHere.com&method=eventpostur {% endrequestdata %} {% endrequestblock %} @@ -161,7 +161,7 @@ Update / Set URL {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=set&user=customer@example.com&url=http://www.SubUserPostUrlHere.com&method=eventpostur + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=set&user=eexampexample@example.com&url=http://www.SubUserPostUrlHere.com&method=eventpostur {% endrequestdata %} {% endrequestblock %} @@ -224,7 +224,7 @@ Delete {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=customer@example.com&method=eventpostur + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=eexampexample@example.com&method=eventpostur {% endrequestdata %} {% endrequestblock %} @@ -247,7 +247,7 @@ Delete {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=customer@example.com&method=eventpostur + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=eexampexample@example.com&method=eventpostur {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html index be66d4d8bf..e5b7627598 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/index.html @@ -66,7 +66,7 @@

Monitor Records

-

Make sure your customers arent sending out spam by getting a sample of their outgoing messages

+

Make sure your customers aren't sending out spam by getting a sample of their outgoing messages

IP Management diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/ip_management.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/ip_management.md index 9623b4ff20..49d95a1a23 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/ip_management.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/ip_management.md @@ -413,7 +413,7 @@ The current breakdown of users who are using your IPs. ### Response -{% codeblock %} 255.255.253.0user4@example.com255.255.254.0user4@example.com255.255.253.0example@example.com255.255.254.0example@example.comJSON Call

@@ -429,7 +429,7 @@ The current breakdown of users who are using your IPs.

Response: Success

{% codeblock %} -{"ip":"255.255.253.0","user":"user4@example.com"},{"ip":"255.255.254.0","user":"user4@example.com"} +{"ip":"255.255.253.0","user":"example@example.com"},{"ip":"255.255.254.0","user":"example@example.com"} {% endcodeblock %} ### Response: Error diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/monitor_records.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/monitor_records.md index 23341e3454..3ebca96a3e 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/monitor_records.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/monitor_records.md @@ -414,7 +414,7 @@ List all available monitor records a reseller has. ### Response {% codeblock %} -monitors>sampleNameAexample@example.com1000sampleNameBexample@example.com10000user1@example.comuser2@example.comsampleNameAexample@example.com1000sampleNameBexample@example.com10000user1@example.comexampexample@example.comomJSON Call @@ -430,7 +430,7 @@ monitors>sampleNameAexample@example.comResponse {% codeblock %} -{"name":"sampleNameA","email":"example@example.com","frequency":"1000","users":[]},{"name":"sampleNameB","email":"example@example.com","frequency":"10000","users":["user1@example.com","user2@example.com"]} +{"name":"sampleNameA","email":"example@example.com","frequency":"1000","users":[]},{"name":"sampleNameB","email":"example@example.com","frequency":"10000","users":["user1@example.com","exampexample@example.comom"]} {% endcodeblock %} * * * * * @@ -491,7 +491,7 @@ Append a monitor record to a existing record onto a customer. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=append&name=myMonitor&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=append&name=myMonitor&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -521,7 +521,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=append&name=myMonitor&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=append&name=myMonitor&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -597,7 +597,7 @@ Detach a customer from a monitor record. {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=detach&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=detach&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -627,7 +627,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=detach&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=detach&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/parse_settings.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/parse_settings.md index 43007f9b87..3e2486f327 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/parse_settings.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/parse_settings.md @@ -56,7 +56,7 @@ Get Current Settings {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=parse&task=get&method=parse&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=parse&task=get&method=parse&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -97,7 +97,7 @@ Get Current Settings {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=set&method=parse&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=set&method=parse&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -188,7 +188,7 @@ Edit Entry {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=update&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=update&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -222,7 +222,7 @@ Edit Entry {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=parse&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=parse&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -307,7 +307,7 @@ Delete Entry {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&task=delete&method=parse&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&task=delete&method=parse&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -341,7 +341,7 @@ Delete Entry {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&task=delete&method=parse&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&task=delete&method=parse&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/pending_account_changes.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/pending_account_changes.md index a7d4859b78..1fe1ab34a6 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/pending_account_changes.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/pending_account_changes.md @@ -148,7 +148,7 @@ Cancel/Revert a pending change. {% requesturl POST %}https://api.sendgrid.com/api/distributor.pending.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -178,7 +178,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.pending.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=customer@example.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=eexampexample@example.com {% endrequestdata %} {% endrequestblock %} @@ -241,7 +241,7 @@ Once an upgrade happens, an invoice is generated for that user. If it's a free u ip[] Maybe Yes - If the package you are upgrading your user requires a whitelabel and/or an unique IP, you must assign a free IP to this user. + If the package you are upgrading your user to requires a whitelabel and/or a unique IP, you must assign a free IP to this user. ip_group[] @@ -258,7 +258,7 @@ Once an upgrade happens, an invoice is generated for that user. If it's a free u {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_upgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_upgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -288,7 +288,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_upgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_upgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -351,7 +351,7 @@ Once a downgrade happens, an invoice is generated for that user. Free customers ip[] Optional - If the package you are downgrading your user requires a whitelabel and/or an unique IP, you may assign a free IP to this customer using your assigned IPs in suppliment from SendGrid. + If the package you are downgrading your user to requires a whitelabel and/or a unique IP, you may assign a free IP to this customer using your assigned IPs in supplement from SendGrid. ip_group[] @@ -368,7 +368,7 @@ Once a downgrade happens, an invoice is generated for that user. Free customers {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_downgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_downgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -398,7 +398,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_downgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_downgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -428,7 +428,7 @@ result>success Immediate Close {% endanchor %} -Close or revert an account to a free user immediately. An invoice is generated for that user with the new package price (if no overages are incurred, a invoice with zero amount due is generated. +Close or revert an account to a free user immediately. An invoice is generated for that user with the new package price (if no overages are incurred, an invoice with zero amount due is generated. @@ -468,7 +468,7 @@ Close or revert an account to a free user immediately. An invoice is generated f {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_close&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_close&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -498,7 +498,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_close&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_close&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -561,7 +561,7 @@ Apply an upgrade at the end of the user's billing cycle. Once an upgrade happens - + @@ -578,7 +578,7 @@ Apply an upgrade at the end of the user's billing cycle. Once an upgrade happens {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_upgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_upgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -608,7 +608,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_upgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_upgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -671,7 +671,7 @@ Apply a downgrade at the end of the user's billing cycle. Once a downgrade happe - + @@ -688,7 +688,7 @@ Apply a downgrade at the end of the user's billing cycle. Once a downgrade happe {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_downgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_downgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -718,7 +718,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_downgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_downgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -748,7 +748,7 @@ result>success Scheduled Close {% endanchor %} -Close or revert an account to a free user at the end of the user's billing cycle. Once a closure happens, an invoice is generated for that user with the new package price (if no overages are incurred, a invoice with zero amount due is generated. +Close or revert an account to a free user at the end of the user's billing cycle. Once a closure happens, an invoice is generated for that user with the new package price (if no overages are incurred, an invoice with zero amount due is generated.
ip[] Maybe YesIf the package you are upgrading your user requires a whitelabel and/or an unique IP, you must assign a free IP to this user.If the package you are upgrading your user to requires a whitelabel and/or a unique IP, you must assign a free IP to this user.
ip_group[]
ip[] Maybe YesIf the package you are upgrading your user requires a whitelabel and/or an unique IP, you must assign a free IP to this user.If the package you are upgrading your user to requires a whitelabel and/or a unique IP, you must assign a free IP to this user.
ip_group[]
@@ -788,7 +788,7 @@ Close or revert an account to a free user at the end of the user's billing cycle {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_close&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_close&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} @@ -818,7 +818,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.account.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_close&user=customer@example.com&ip_group[]=Reseller Grou + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=scheduled_close&user=eexampexample@example.com&ip_group[]=Reseller Grou {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/whitelabel.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/whitelabel.md index 350e5dec6a..5e907252e3 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/whitelabel.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v1_(deprecated)/whitelabel.md @@ -129,7 +129,7 @@ Append {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.xml {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=whitelabel&task=append&user=customer@example.com&mail_domain=email.sendgrid.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=whitelabel&task=append&user=eexampexample@example.com&mail_domain=email.sendgrid.com {% endrequestdata %} {% endrequestblock %} @@ -159,7 +159,7 @@ result>success {% requesturl POST %}https://api.sendgrid.com/api/distributor.manage.json {% endrequesturl %} - {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=whitelabel&task=append&user=customer@example.com&mail_domain=email.sendgrid.com + {% requestdata Data POST %}api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=whitelabel&task=append&user=eexampexample@example.com&mail_domain=email.sendgrid.com {% endrequestdata %} {% endrequestblock %} diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_as_you_go_usage.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_as_you_go_usage.md index b63142accd..1f6d78a01a 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_as_you_go_usage.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_as_you_go_usage.md @@ -31,7 +31,7 @@ Retrieve invoices/usages from end users before your scheduled billing date. "prorated": 0, "start_date": "2010-08-01", "end_date": "2010-08-31", - "username": "user4@example.com", + "username": "example@example.com", "package": "Example Package", "additional_charges": 0, "final_amount": 1007.95 @@ -51,7 +51,7 @@ Retrieve invoices/usages from end users before your scheduled billing date. 02010-08-012010-08-31 - user4@example.com + example@example.comExample Package01007.95 diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_end_users_invoices_usage.md b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_end_users_invoices_usage.md index 7e90b396e3..75e2991fbe 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_end_users_invoices_usage.md +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/billing_retrieving_end_users_invoices_usage.md @@ -35,7 +35,7 @@ Retrieve invoices/usages from customers. "prorated": 0, "start_date": "2010-08-01", "end_date": "2010-08-31", - "username": "user4@example.com", + "username": "example@example.com", "package": "Example Package", "additional_charges": 0, "final_amount": 1007.95 @@ -74,7 +74,7 @@ Retrieve invoices/usages from customers. 02010-08-012010-08-31 - user4@example.com + example@example.comExample Package01007.95 diff --git a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/index.html b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/index.html index 684c14cc98..df1450f233 100644 --- a/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/index.html +++ b/source/API_Reference/Web_API/Legacy_Features/Reseller_API/v2_(deprecated)/index.html @@ -17,4 +17,4 @@ {% anchor h2 %} Billing: Retrieving As-You-Go Usage {% endanchor %} -

Retrieve invoices/usages from end users before your scheduled billing date.

\ No newline at end of file +

Retrieve invoices/usages from end users before your scheduled billing date.

diff --git a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_bounces.md b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_bounces.md index 38788e1a5b..e5954e87b7 100644 --- a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_bounces.md +++ b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_bounces.md @@ -23,15 +23,15 @@ Retrieve Bounces {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "status": "5.1.1", - "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com", + "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "status": "5.1.1", - "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com", + "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -39,15 +39,15 @@ Retrieve Bounces {% response xml %} - email1@domain.com + emaieexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com 2009-06-10 12:40:30 @@ -72,7 +72,7 @@ Since SendGrid does not re-deliver to bounced addresses, users can remove bounce {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.subuserManage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=example@example.com&task=delete&email=bounce@example.com %} +{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.subuserManage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=example@example.com&task=delete&email=bounceexampexample@example.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_invalid_emails.md b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_invalid_emails.md index 6042dcea38..37df2373ab 100644 --- a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_invalid_emails.md +++ b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_invalid_emails.md @@ -23,7 +23,7 @@ Retrieve Invalid Emails {% response json %} [ { - "email": "isaac@hotmail.comm", + "email": "example@example.com", "reason": "Mail domain mentioned in email address is unknown", "created": "2009-06-01 19:41:39" }, @@ -33,7 +33,7 @@ Retrieve Invalid Emails "created": "2009-06-01 19:41:39" }, { - "email": "isaac@example.com", + "email": "example@example.com", "reason": "Known bad domain", "created": "2009-06-01 19:41:39" } @@ -42,7 +42,7 @@ Retrieve Invalid Emails {% response xml %} - isaac@hotmail.comm + example@example.com Mail domain mentioned in email address is unknown 2009-06-10 12:40:30 @@ -52,7 +52,7 @@ Retrieve Invalid Emails 2009-06-10 12:40:30 - isaac@example.com + example@example.com Known bad domain 2009-06-10 12:40:30 @@ -72,8 +72,8 @@ Since SendGrid does not deliver to invalid emails, users can remove invalid emai {% parameters delete %} {% parameter 'user' 'Yes' 'Customer subuser must be registered under your account' 'The customer subuser we are retrieving invalid emails from' %} - {% parameter 'task' 'Yes' 'Must be set to delete' 'This will allow you to delete a invalid email for the specified customer subuser' %} - {% parameter 'email' 'No' 'Must be a invalid email' 'You must specify the invalid emails to remove' %} + {% parameter 'task' 'Yes' 'Must be set to delete' 'This will allow you to delete an invalid email for the specified customer subuser' %} + {% parameter 'email' 'No' 'Must be an invalid email' 'You must specify the invalid emails to remove' %} {% parameter 'method' 'Yes' 'Must be set to invalidemails' 'Allows you to access invalid email functionality' %} {% endparameters %} diff --git a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_monitor_outgoing_email.md b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_monitor_outgoing_email.md index 3b1abe33f8..353987a7ac 100644 --- a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_monitor_outgoing_email.md +++ b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_monitor_outgoing_email.md @@ -131,7 +131,7 @@ List all available monitor records that a reseller has. "frequency": "10000", "users": [ "user1@example.com", - "user2@example.com" + "exampexample@example.comom" ] } ] @@ -150,7 +150,7 @@ List all available monitor records that a reseller has. 10000 user1@example.com - user2@example.com + exampexample@example.comom diff --git a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_spam_reports.md b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_spam_reports.md index e2068a6a4b..2e99a1a869 100644 --- a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_spam_reports.md +++ b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_spam_reports.md @@ -22,11 +22,11 @@ Retrieve Spam Reports {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -34,11 +34,11 @@ Retrieve Spam Reports {% response xml %} - email1@domain.com + emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 2009-06-10 12:40:30 diff --git a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_timezone.md b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_timezone.md index 4f3182d02a..4ecd6f0463 100644 --- a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_timezone.md +++ b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_timezone.md @@ -83,7 +83,7 @@ This API call will return the timezone currently set for your customer subuser. {% endparameters %} -{% apiexample get GET https://api.sendgrid.com/apiv2/reseller.subuserManage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=get&user=customer_subuser@example.com %} +{% apiexample get GET https://api.sendgrid.com/apiv2/reseller.subuserManage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=get&user=customer_subuseexampexample@example.com %} {% response json %} { "name": "Central Time, US & Canada", @@ -120,7 +120,7 @@ This API call will allow you to set the timezone for your customer subuser {% endparameters %} -{% apiexample edit POST https://api.sendgrid.com/apiv2/reseller.subuserManage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=set&user=customer_subuser@example.com&timezone=America/Los_Angeles %} +{% apiexample edit POST https://api.sendgrid.com/apiv2/reseller.subuserManage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=set&user=customer_subuseexampexample@example.com&timezone=America/Los_Angeles %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_unsubscribes.md b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_unsubscribes.md index 1193282bfd..37b4761bc4 100644 --- a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_unsubscribes.md +++ b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/customer_subuser_unsubscribes.md @@ -25,11 +25,11 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -37,11 +37,11 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% response xml %} - email1@domain.com + emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 2009-06-10 12:40:30 diff --git a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/index.html b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/index.html index dfe9d3851f..0899b7dad2 100644 --- a/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/index.html +++ b/source/API_Reference/Web_API/Reseller_API/Reseller_Customer_Subuser_API/index.html @@ -29,7 +29,7 @@

Manage your Customer Subusers' Invalid Email records.

{% anchor h2 %} -Customer Subuser Unsubscribes +Customer Subuser Unsubscribes {% endanchor %}

Manage your Customer Subusers' the Unsubscribe records.

diff --git a/source/API_Reference/Web_API/Reseller_API/account_changes.md b/source/API_Reference/Web_API/Reseller_API/account_changes.md index b00f7d0c5d..f153571750 100644 --- a/source/API_Reference/Web_API/Reseller_API/account_changes.md +++ b/source/API_Reference/Web_API/Reseller_API/account_changes.md @@ -16,14 +16,17 @@ Upgrading a user generates an invoice. If the user is upgrading from a free to a {% parameters upgrade %} {% parameter 'task' 'Yes' 'Must be set to immediate_upgrade .' %} - {% parameter 'user' 'Yes' 'Must be an User under your account.' 'The customers username.' %} + {% parameter 'user' 'Yes' 'Must be a User under your account.' 'The customers username.' %} {% parameter 'package' 'Yes' 'The name of the package you will be upgrading the User to.' %} - {% parameter 'ip[]' 'No' 'If the package you are upgrading your user requires a whitelabel and/or an unique IP, you must assign a free IP to this user.' %} + {% parameter 'ip[]' 'No' 'If the package you are upgrading your user to requires a whitelabel and/or a unique IP, you must assign a free IP to this user.' %} {% parameter 'ip_group[]' 'No' 'If the package you are upgrading your user to does not require an IP or whitelabel, you must place them in an IP group.' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} -{% apiexample upgrade POST https://api.sendgrid.com/apiv2/reseller.account api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_upgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Group %} +{% apiexample upgrade POST https://api.sendgrid.com/apiv2/reseller.account api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_upgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Group %} {% response json %} { "message": "error", @@ -51,14 +54,14 @@ Once a downgrade happens, an invoice is generated for that user. Free customers {% parameters downgrade %} {% parameter 'task' 'Yes' 'Must be set to immediate_downgrade .' %} - {% parameter 'user' 'Yes' 'Must be an User under your account.' 'The customers username.' %} + {% parameter 'user' 'Yes' 'Must be a User under your account.' 'The customers username.' %} {% parameter 'package' 'Yes' 'The name of the package you will be downgrading the User to.' %} - {% parameter 'ip[]' 'No' 'If the package you are downgrading your user requires a whitelabel and/or an unique IP, you may assign a free IP to this customer using your assigned IPs in suppliment from SendGrid.' %} + {% parameter 'ip[]' 'No' 'If the package you are downgrading your user to requires a whitelabel and/or a unique IP, you may assign a free IP to this customer using your assigned IPs in supplement from SendGrid.' %} {% parameter 'ip_group[]' 'No' 'If the package you are downgrading your user to does not require an IP or whitelabel, you may place them in an IP group.' %} {% endparameters %} -{% apiexample downgrade POST https://api.sendgrid.com/apiv2/reseller.account api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_downgrade&package=Basic Package&user=customer@example.com&ip_group[]=Reseller Group %} +{% apiexample downgrade POST https://api.sendgrid.com/apiv2/reseller.account api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_downgrade&package=Basic Package&user=eexampexample@example.com&ip_group[]=Reseller Group %} {% response json %} { "message": "success" @@ -78,7 +81,7 @@ Once a downgrade happens, an invoice is generated for that user. Free customers Immediate Close {% endanchor %} -Close or revert an account to a free user immediately. An invoice is generated for that user with the new package price (if no overages are incurred, a invoice with zero amount due is generated. +Close or revert an account to a free user immediately. An invoice is generated for that user with the new package price (if no overages are incurred, an invoice with zero amount due is generated. {% parameters close %} @@ -88,7 +91,7 @@ Close or revert an account to a free user immediately. An invoice is generated f {% endparameters %} -{% apiexample close POST https://api.sendgrid.com/apiv2/reseller.account api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_close&user=customer@example.com&ip_group[]=Reseller Group %} +{% apiexample close POST https://api.sendgrid.com/apiv2/reseller.account api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=immediate_close&user=eexampexample@example.com&ip_group[]=Reseller Group %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/account_overview.md b/source/API_Reference/Web_API/Reseller_API/account_overview.md index a179fa7d1d..d3789be0dd 100644 --- a/source/API_Reference/Web_API/Reseller_API/account_overview.md +++ b/source/API_Reference/Web_API/Reseller_API/account_overview.md @@ -14,8 +14,11 @@ View general account information regarding your customers, including billing cyc {% parameter 'user' 'Yes' 'Customer that is registered under your account.' 'The customer' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.account api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=overview&user=customer@example.com %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.account api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=overview&user=eexampexample@example.com %} {% response json %} { "reputation": "100", diff --git a/source/API_Reference/Web_API/Reseller_API/apps.md b/source/API_Reference/Web_API/Reseller_API/apps.md index 87c88c107d..cfae19d200 100644 --- a/source/API_Reference/Web_API/Reseller_API/apps.md +++ b/source/API_Reference/Web_API/Reseller_API/apps.md @@ -21,8 +21,11 @@ Note: The *name* entry is used in all the other API calls to identify a app. {% parameter 'method' 'Yes' 'Must be set to apps' 'Allows you to access apps functionality' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=getavailable&method=apps&user=customer@example.com %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=getavailable&method=apps&user=eexampexample@example.com %} {% response json %} [ { @@ -72,7 +75,7 @@ Activate App {% endparameters %} -{% apiexample activate POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=newrelic&method=apps&task=activate&user=customer@example.com %} +{% apiexample activate POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=newrelic&method=apps&task=activate&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -100,7 +103,7 @@ Deactivate App {% endparameters %} -{% apiexample deactivate POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=newrelic&method=apps&task=deactivate&user=customer@example.com %} +{% apiexample deactivate POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=newrelic&method=apps&task=deactivate&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -129,7 +132,7 @@ These API calls require that settings are passed using POST. {% parameter 'field_name' 'Yes' 'Must be set to a setting field name' 'The [fields]({{root_url}}/API_Reference/Web_API/filter_settings.html) required for each app to work properly' %} {% endparameters %} -{% apiexample customize POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=newrelic&method=apps&task=setup&user=customer@example.com&licence_key=1234567&enable_subusers=true %} +{% apiexample customize POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=newrelic&method=apps&task=setup&user=eexampexample@example.com&licence_key=1234567&enable_subusers=true %} {% response json %} { "message": "success" @@ -155,7 +158,7 @@ Get Current Settings {% parameter 'name' 'Yes' 'Must be set to name of the app' 'Name is returned in the List API call above' %} {% endparameters %} -{% apiexample settings POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=newrelic&task=getsettings&user=customer@example.com&method=apps %} +{% apiexample settings POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&name=newrelic&task=getsettings&user=eexampexample@example.com&method=apps %} {% response json %} { "settings": { diff --git a/source/API_Reference/Web_API/Reseller_API/authenticate_a_customer.md b/source/API_Reference/Web_API/Reseller_API/authenticate_a_customer.md index 7a49d88abb..5449e70ddd 100644 --- a/source/API_Reference/Web_API/Reseller_API/authenticate_a_customer.md +++ b/source/API_Reference/Web_API/Reseller_API/authenticate_a_customer.md @@ -15,8 +15,11 @@ Authenticate a customer on your website before displaying their account informat {% parameter 'method' 'Yes' 'Must be set to auth . Allows you to access authentication functionality' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} -{% apiexample auth POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=customer@example.com&password=theirsubmittedpassword&method=auth %} +{% apiexample auth POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=eexampexample@example.com&password=theirsubmittedpassword&method=auth %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/customer_account_limits.md b/source/API_Reference/Web_API/Reseller_API/customer_account_limits.md index 262829ef62..62fc9ce441 100644 --- a/source/API_Reference/Web_API/Reseller_API/customer_account_limits.md +++ b/source/API_Reference/Web_API/Reseller_API/customer_account_limits.md @@ -8,6 +8,10 @@ navigation: Throttle your customer when you need them to send only a specific amount of emails at a specified interval. +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} + {% anchor h2 %} Retrieve {% endanchor %} @@ -22,7 +26,7 @@ Retrieve account limits for a specific customer. If the API call response is emp {% endparameters %} -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=customer@example.com&task=retrieve %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=limit&user=eexampexample@example.com&task=retrieve %} {% response json %} { "credit": "40000", @@ -37,4 +41,4 @@ Retrieve account limits for a specific customer. If the API call response is emp 2011-02-21 {% endresponse %} -{% endapiexample %} \ No newline at end of file +{% endapiexample %} diff --git a/source/API_Reference/Web_API/Reseller_API/customer_bounces.md b/source/API_Reference/Web_API/Reseller_API/customer_bounces.md index 81bce5b52c..05a5d93e79 100644 --- a/source/API_Reference/Web_API/Reseller_API/customer_bounces.md +++ b/source/API_Reference/Web_API/Reseller_API/customer_bounces.md @@ -10,6 +10,9 @@ navigation: Retrieve Bounces {% endanchor %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} {% parameters get %} {% parameter 'user' 'Yes' 'Customer must be registered under your account' 'The customer we are retrieving bounces from' %} @@ -18,20 +21,19 @@ Retrieve Bounces {% parameter 'method' 'Yes' 'Must be set to bounces' 'Allows you to access bounces functionality' %} {% endparameters %} - -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=customer@example.com&task=get&date=1 %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=eexampexample@example.com&task=get&date=1 %} {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "status": "5.1.1", - "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com", + "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "status": "5.1.1", - "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com", + "reason": "host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -39,15 +41,15 @@ Retrieve Bounces {% response xml %} - email1@domain.com + emaieexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com 2009-06-10 12:40:30 @@ -72,7 +74,7 @@ Since SendGrid does not re-deliver to bounced addresses, users can remove bounce {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=customer@example.com&task=delete&email=bounce@example.com %} +{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=bounces&user=eexampexample@example.com&task=delete&email=bounceexampexample@example.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/customer_invalid_emails.md b/source/API_Reference/Web_API/Reseller_API/customer_invalid_emails.md index 30dab7abf7..fcea8b09f3 100644 --- a/source/API_Reference/Web_API/Reseller_API/customer_invalid_emails.md +++ b/source/API_Reference/Web_API/Reseller_API/customer_invalid_emails.md @@ -10,7 +10,6 @@ navigation: Retrieve Invalid Emails {% endanchor %} - {% parameters get %} {% parameter 'user' 'Yes' 'Customer must be registered under your account' 'The customer we are retrieving invalid emails from' %} {% parameter 'task' 'Yes' 'Must be set to get' 'This will allow you to retrieve the invalid emails for the specified customer' %} @@ -18,12 +17,15 @@ Retrieve Invalid Emails {% parameter 'method' 'Yes' 'Must be set to invalidemails' 'Allows you to access invalid email functionality' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=customer@example.com&task=get&date=1 %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=eexampexample@example.com&task=get&date=1 %} {% response json %} [ { - "email": "isaac@hotmail.comm", + "email": "example@example.com", "reason": "Mail domain mentioned in email address is unknown", "created": "2009-06-01 19:41:39" }, @@ -33,7 +35,7 @@ Retrieve Invalid Emails "created": "2009-06-01 19:41:39" }, { - "email": "isaac@example.com", + "email": "example@example.com", "reason": "Known bad domain", "created": "2009-06-01 19:41:39" } @@ -42,7 +44,7 @@ Retrieve Invalid Emails {% response xml %} - isaac@hotmail.comm + example@example.com Mail domain mentioned in email address is unknown 2009-06-10 12:40:30 @@ -52,7 +54,7 @@ Retrieve Invalid Emails 2009-06-10 12:40:30 - isaac@example.com + example@example.com Known bad domain 2009-06-10 12:40:30 @@ -72,13 +74,13 @@ Since SendGrid does not deliver to invalid emails, users can remove invalid emai {% parameters delete %} {% parameter 'user' 'Yes' 'Customer must be registered under your account' 'The customer we are retrieving invalid emails from' %} - {% parameter 'task' 'Yes' 'Must be set to delete' 'This will allow you to delete a invalid email for the specified customer' %} - {% parameter 'email' 'Yes' 'Must be a invalid email' 'You must specify the invalid emails to remove' %} + {% parameter 'task' 'Yes' 'Must be set to delete' 'This will allow you to delete an invalid email for the specified customer' %} + {% parameter 'email' 'Yes' 'Must be an invalid email' 'You must specify the invalid emails to remove' %} {% parameter 'method' 'Yes' 'Must be set to invalidemails' 'Allows you to access invalid emails functionality' %} {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=customer@example.com&task=delete&email=invalidemail@example.com %} +{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=invalidemails&user=eexampexample@example.com&task=delete&email=invalidemail@example.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/customer_management.md b/source/API_Reference/Web_API/Reseller_API/customer_management.md index 2c22025edb..22fae372ef 100644 --- a/source/API_Reference/Web_API/Reseller_API/customer_management.md +++ b/source/API_Reference/Web_API/Reseller_API/customer_management.md @@ -34,7 +34,7 @@ Create a Customer {% endparameters %} -{% apiexample create POST https://api.sendgrid.com/apiv2/reseller.add api_user=your_sendgrid_username&api_key=your_sendgrid_password&username=newcustomer@example.com&website=example.com&password=samplepassword&confirm_password=samplepassword&first_name=fname&last_name=lname&address=555_anystreet&city=any_city&state=CA&zip=91234&email=newcustomer@example.com&country=US&phone=555-555&free_user=true&company=company&whitelabel=sendgrid.me %} +{% apiexample create POST https://api.sendgrid.com/apiv2/reseller.add api_user=your_sendgrid_username&api_key=your_sendgrid_password&username=neweexampexample@example.com&website=example.com&password=samplepassword&confirm_password=samplepassword&first_name=fname&last_name=lname&address=555_anystreet&city=any_city&state=CA&zip=91234&email=neweexampexample@example.com&country=US&phone=555-555&free_user=true&company=company&whitelabel=sendgrid.me %} {% response json %} { "message": "success" @@ -60,7 +60,7 @@ Remove a customer from your account. This is **not** the same as disabling a cus {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.delete api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=customer@example.com %} +{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.delete api_user=your_sendgrid_username&api_key=your_sendgrid_password&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -186,7 +186,7 @@ Enable a customer so they may start sending out emails again. This call will not {% endparameters %} -{% apiexample enable POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=enable&user=customer@example.com %} +{% apiexample enable POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=enable&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -213,7 +213,7 @@ This prevents them from sending out emails with SendGrid. {% endparameters %} -{% apiexample disable POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=disable&user=customer@example.com %} +{% apiexample disable POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=disable&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -240,7 +240,7 @@ Allow a customer to login to the SendGrid.com website. This call will not enable {% endparameters %} -{% apiexample website POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_enable&user=customer@example.com %} +{% apiexample website POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_enable&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -267,7 +267,7 @@ Disallow a customer to login to the SendGrid.com website. This call will not pre {% endparameters %} -{% apiexample unwebsite POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_disable&user=customer@example.com %} +{% apiexample unwebsite POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=website_disable&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -304,7 +304,7 @@ Allows you to update your customers profile information {% endparameters %} -{% apiexample update POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=set&user=customer@example.com&first_name=newFirstName&last_name=newLastName %} +{% apiexample update POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=set&user=eexampexample@example.com&first_name=newFirstName&last_name=newLastName %} {% response json %} { "message": "success" @@ -333,7 +333,7 @@ Passwords are encrypted by default and therefore cannot be retrieved; however, y {% endparameters %} -{% apiexample password POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=password&user=customer@example.com&password=newPasword&confirm_password=newPassword %} +{% apiexample password POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=password&user=eexampexample@example.com&password=newPasword&confirm_password=newPassword %} {% response json %} { "message": "success" @@ -362,7 +362,7 @@ Note that your customer account username is used to login to our SMTP server *an {% endparameters %} -{% apiexample name POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setUsername&user=customer@example.com&username=newcustomer@example.com %} +{% apiexample name POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setUsername&user=eexampexample@example.com&username=neweexampexample@example.com %} {% response json %} { "message": "success" @@ -391,7 +391,7 @@ This is the contact email we use for your customers. Changes take place immediat {% endparameters %} -{% apiexample email POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setEmail&user=customer@example.com&email=newcustomer@example.com %} +{% apiexample email POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=profile&task=setEmail&user=eexampexample@example.com&email=neweexampexample@example.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/customer_spam_reports.md b/source/API_Reference/Web_API/Reseller_API/customer_spam_reports.md index bec3e9380d..2ce576322c 100644 --- a/source/API_Reference/Web_API/Reseller_API/customer_spam_reports.md +++ b/source/API_Reference/Web_API/Reseller_API/customer_spam_reports.md @@ -18,16 +18,19 @@ Retrieve Spam Reports {% parameter 'method' 'Yes' 'Must be set to spamreports' 'Allows you to access spam reports functionality' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=customer@example.com&task=get&date=1 %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=eexampexample@example.com&task=get&date=1 %} {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -35,11 +38,11 @@ Retrieve Spam Reports {% response xml %} - email1@domain.com + emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 2009-06-10 12:40:30 @@ -64,7 +67,7 @@ Since SendGrid does not deliver to spam reported addresses, users can remove spa {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=customer@example.com&task=delete&email=spamreport@domain.com %} +{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=spamreports&user=eexampexample@example.com&task=delete&email=spamreport@domain.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/customer_statistics.md b/source/API_Reference/Web_API/Reseller_API/customer_statistics.md index 301da01e77..58524bc5ee 100644 --- a/source/API_Reference/Web_API/Reseller_API/customer_statistics.md +++ b/source/API_Reference/Web_API/Reseller_API/customer_statistics.md @@ -22,9 +22,13 @@ Note that you can use *either* the days parameter *or* the `start_date` and `end {% endparameters %} -To retrive statistics for the Marketing Emails application you can use [Category Statistics](#-Category-Statistics) with `category=Newsletter` parameter. +To retrieve statistics for the Marketing Emails application you can use [Category Statistics](#-Category-Statistics) with `category=Newsletter` parameter. -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=customer@example.com %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} + +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=eexampexample@example.com %} {% response json %} [ { @@ -154,7 +158,7 @@ Retrieve all-time totals for your customer {% endparameters %} -{% apiexample agg POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=customer@example.com&aggregate=1 %} +{% apiexample agg POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=eexampexample@example.com&aggregate=1 %} {% response json %} { "requests": 12342, @@ -210,7 +214,7 @@ Retrieve a list of all the categories used in your customers account. {% endparameters %} -{% apiexample cat POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=customer@example.com&list=true %} +{% apiexample cat POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=eexampexample@example.com&list=true %} {% response json %} [ { @@ -255,7 +259,7 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% endparameters %} -{% apiexample catstat POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=customer@example.com&start_date=2009-06-20&end_date=2009-06-22&category=category %} +{% apiexample catstat POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=stats&user=eexampexample@example.com&start_date=2009-06-20&end_date=2009-06-22&category=category %} {% response json %} [ { diff --git a/source/API_Reference/Web_API/Reseller_API/customer_timezone.md b/source/API_Reference/Web_API/Reseller_API/customer_timezone.md index 26e59ce699..938972da48 100644 --- a/source/API_Reference/Web_API/Reseller_API/customer_timezone.md +++ b/source/API_Reference/Web_API/Reseller_API/customer_timezone.md @@ -18,6 +18,9 @@ This will return a list of all available timezones. {% parameter 'task' 'Yes' 'Must be set to list' 'This will allow you to retrieve the timezones' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} {% apiexample list GET https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=list %} {% response json %} @@ -83,7 +86,7 @@ This API call will return the timezone currently set for your customer. {% endparameters %} -{% apiexample get GET https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=get&user=customer@example.com %} +{% apiexample get GET https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=get&user=eexampexample@example.com %} {% response json %} { "name": "Central Time, US & Canada", @@ -120,7 +123,7 @@ This API call will allow you to set timezone for your customer {% endparameters %} -{% apiexample edit POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=set&user=customer@example.com&timezone=America/Los_Angeles %} +{% apiexample edit POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=timezone&task=set&user=eexampexample@example.com&timezone=America/Los_Angeles %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/customer_unsubscribes.md b/source/API_Reference/Web_API/Reseller_API/customer_unsubscribes.md index 0ae541c620..c5c20a579e 100644 --- a/source/API_Reference/Web_API/Reseller_API/customer_unsubscribes.md +++ b/source/API_Reference/Web_API/Reseller_API/customer_unsubscribes.md @@ -12,6 +12,9 @@ Retrieve Unsubscribes Note that you can use *either* the days parameter *or* the start_date and end_date parameter. +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} {% parameters get %} {% parameter 'user' 'Yes' 'Customer must be registered under your account' 'The customer we are retrieving unsubscribes from' %} @@ -21,15 +24,15 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% endparameters %} -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=get&date=1 %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=get&date=1 %} {% response json %} [ { - "email": "email1@domain.com", + "email": "emaieexampexample@example.com", "created": "2009-06-01 19:41:39" }, { - "email": "email2@domain2.com", + "email": "emaileexampexample@example.com", "created": "2009-06-01 19:41:39" } ] @@ -37,11 +40,11 @@ Note that you can use *either* the days parameter *or* the start_date and end_da {% response xml %} - email1@domain.com + emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 2009-06-10 12:40:30 @@ -66,7 +69,7 @@ Since SendGrid does not deliver to unsubscribe addresses, users can remove unsub {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=delete&email=unsubscribe@sample.com %} +{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=delete&email=unsubscribe@sample.com %} {% response json %} { "message": "success" @@ -97,7 +100,7 @@ Add unsubscribe email records to their account if they need to stop sending emai {% endparameters %} -{% apiexample add POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=customer@example.com&task=add&email=unsubscribe@sample.com %} +{% apiexample add POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=unsubscribes&user=eexampexample@example.com&task=add&email=unsubscribe@sample.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/event_notification_url.md b/source/API_Reference/Web_API/Reseller_API/event_notification_url.md index 385cb8862c..fd4d812153 100644 --- a/source/API_Reference/Web_API/Reseller_API/event_notification_url.md +++ b/source/API_Reference/Web_API/Reseller_API/event_notification_url.md @@ -16,8 +16,11 @@ Retrieve {% parameter 'method' 'Yes' 'Must be set to eventposturl' 'Allows you to access post event url functionality' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=get&user=customer@example.com&method=eventpostur %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=get&user=eexampexample@example.com&method=eventpostur %} {% response json %} { "url": "http://www.SubUserPostUrlHere.com" @@ -43,7 +46,7 @@ Update / Set URL {% endparameters %} -{% apiexample set POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=set&user=customer@example.com&url=http://www.SubUserPostUrlHere.com&method=eventposturl %} +{% apiexample set POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=set&user=eexampexample@example.com&url=http://www.SubUserPostUrlHere.com&method=eventposturl %} {% response json %} { "message": "success" @@ -70,7 +73,7 @@ Delete {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=customer@example.com&method=eventposturl %} +{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=delete&user=eexampexample@example.com&method=eventposturl %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/index.html b/source/API_Reference/Web_API/Reseller_API/index.html index 14b561b679..13e0472f37 100644 --- a/source/API_Reference/Web_API/Reseller_API/index.html +++ b/source/API_Reference/Web_API/Reseller_API/index.html @@ -57,7 +57,7 @@ {% anchor h2 %} Monitor Records {% endanchor %} -

Make sure your customers arent sending out spam by getting a sample of their outgoing messages

+

Make sure your customers aren't sending out spam by getting a sample of their outgoing messages

{% anchor h2 %} IP Management diff --git a/source/API_Reference/Web_API/Reseller_API/invoice_retrieval.md b/source/API_Reference/Web_API/Reseller_API/invoice_retrieval.md index e3e7b4a84c..8a71e2e3ce 100644 --- a/source/API_Reference/Web_API/Reseller_API/invoice_retrieval.md +++ b/source/API_Reference/Web_API/Reseller_API/invoice_retrieval.md @@ -23,6 +23,9 @@ Return an array of invoice numbers to your account. {% parameter 'status' 'No' 'Must be either paid, unpaid, refunded, deferred, canceled. This is used to specify what kind of invoice you would like returned.' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} {% apiexample get POST https://api.sendgrid.com/api/billing.list api_user=your_sendgrid_username&api_key=your_sendgrid_password&status=pai %} {% response json %} diff --git a/source/API_Reference/Web_API/Reseller_API/ip_management.md b/source/API_Reference/Web_API/Reseller_API/ip_management.md index 1f4b56a7c0..278716975f 100644 --- a/source/API_Reference/Web_API/Reseller_API/ip_management.md +++ b/source/API_Reference/Web_API/Reseller_API/ip_management.md @@ -19,6 +19,9 @@ View all IPs under your account. {% parameter 'system' 'No' 'Must be set to true .' 'Include IPs assigned by SendGrid.' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} {% apiexample get POST https://api.sendgrid.com/apiv2/reseller.ip api_user=your_sendgrid_username&api_key=your_sendgrid_password&task=all %} {% response json %} @@ -224,11 +227,11 @@ The current breakdown of users who are using your IPs. [ { "ip": "255.255.253.0", - "user": "user4@example.com" + "user": "example@example.com" }, { "ip": "255.255.254.0", - "user": "user4@example.com" + "user": "example@example.com" } ] {% endresponse %} @@ -236,11 +239,11 @@ The current breakdown of users who are using your IPs. 255.255.253.0 - user4@example.com + example@example.com 255.255.254.0 - user4@example.com + example@example.com diff --git a/source/API_Reference/Web_API/Reseller_API/monitor_records.md b/source/API_Reference/Web_API/Reseller_API/monitor_records.md index ba8f68c173..9e5ef4dcc9 100644 --- a/source/API_Reference/Web_API/Reseller_API/monitor_records.md +++ b/source/API_Reference/Web_API/Reseller_API/monitor_records.md @@ -10,6 +10,10 @@ Receive a sample of an outgoing message by a specific customer. The first step is to create a Monitor Record. Once the monitor record has been created, a reseller can append a monitor record to a customer. Multiple customer can be appended to a single monitor record. +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} + * * * * * {% anchor h2 %} @@ -137,7 +141,7 @@ List all available monitor records a reseller has. "frequency": "10000", "users": [ "user1@example.com", - "user2@example.com" + "exampexample@example.comom" ] } ] @@ -156,7 +160,7 @@ List all available monitor records a reseller has. 10000 user1@example.com - user2@example.com + exampexample@example.comom @@ -181,7 +185,7 @@ Append a monitor record to a existing record onto a customer. {% endparameters %} -{% apiexample append POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=append&name=myMonitor&user=customer@example.com %} +{% apiexample append POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=append&name=myMonitor&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -211,7 +215,7 @@ Detach a customer from a monitor record. {% endparameters %} -{% apiexample detach POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=detach&user=customer@example.com %} +{% apiexample detach POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=monitor&task=detach&user=eexampexample@example.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/parse_settings.md b/source/API_Reference/Web_API/Reseller_API/parse_settings.md index 5700bda848..00a36a1c6b 100644 --- a/source/API_Reference/Web_API/Reseller_API/parse_settings.md +++ b/source/API_Reference/Web_API/Reseller_API/parse_settings.md @@ -17,8 +17,11 @@ Get Current Settings {% parameter 'method' 'Yes' 'Must be set to parse' 'Allows you to access parse functionality' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} -{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=parse&task=get&method=parse&user=customer@example.com %} +{% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=parse&task=get&method=parse&user=eexampexample@example.com %} {% response json %} { "parse": [ @@ -58,7 +61,7 @@ Create New Entry {% endparameters %} -{% apiexample create POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=set&method=parse&user=customer@example.com %} +{% apiexample create POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=set&method=parse&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -88,7 +91,7 @@ Edit Entry {% endparameters %} -{% apiexample edit POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=update&user=customer@example.com %} +{% apiexample edit POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&url=www.mydomain.com/parse.php&spam_check=1&method=parse&task=update&user=eexampexample@example.com %} {% response json %} { "message": "success" @@ -117,7 +120,7 @@ Delete Entry {% endparameters %} -{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&task=delete&method=parse&user=customer@example.com %} +{% apiexample delete POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&hostname=www.example.com&task=delete&method=parse&user=eexampexample@example.com %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_API/view_available_packages.md b/source/API_Reference/Web_API/Reseller_API/view_available_packages.md index f7fb04c354..115e26e588 100644 --- a/source/API_Reference/Web_API/Reseller_API/view_available_packages.md +++ b/source/API_Reference/Web_API/Reseller_API/view_available_packages.md @@ -10,6 +10,10 @@ List all packages available to your account. There are no extra parameters required for this call +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} + {% apiexample get POST https://api.sendgrid.com/apiv2/reseller.packages api_user=your_sendgrid_username&api_key=your_sendgrid_password %} {% response json %} [ diff --git a/source/API_Reference/Web_API/Reseller_API/whitelabel.md b/source/API_Reference/Web_API/Reseller_API/whitelabel.md index 2313ca40ca..88fb0a8b53 100644 --- a/source/API_Reference/Web_API/Reseller_API/whitelabel.md +++ b/source/API_Reference/Web_API/Reseller_API/whitelabel.md @@ -16,10 +16,13 @@ List {% parameters get %} - {% parameter 'list' 'Yes' 'Must be set to list' %} + {% parameter 'task' 'Yes' 'Must be set to list' %} {% parameter 'method' 'Yes' 'Must be set to whitelabel' %} {% endparameters %} +{% info %} +These are Reseller Only APIs. For more information, see [Reseller Overview](https://sendgrid.com/docs/API_Reference/Web_API/Reseller_API/index.html). +{% endinfo %} {% apiexample get POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=whitelabel&task=list %} {% response json %} @@ -64,7 +67,7 @@ Append {% endparameters %} -{% apiexample append POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=whitelabel&task=append&user=customer@example.com&mail_domain=email.sendgrid.com=m %} +{% apiexample append POST https://api.sendgrid.com/apiv2/reseller.manage api_user=your_sendgrid_username&api_key=your_sendgrid_password&method=whitelabel&task=append&user=eexampexample@example.com&mail_domain=email.sendgrid.com=m %} {% response json %} { "message": "success" diff --git a/source/API_Reference/Web_API/Reseller_Haiku_API/customer_change.html b/source/API_Reference/Web_API/Reseller_Haiku_API/customer_change.html index 323b695464..3f49452d7a 100644 --- a/source/API_Reference/Web_API/Reseller_Haiku_API/customer_change.html +++ b/source/API_Reference/Web_API/Reseller_Haiku_API/customer_change.html @@ -14,7 +14,7 @@ {% parameters post %} {% parameter id Yes 'Id of the customer on SendGrid side' 'This value is returned in the Provision call '%} - {% parameter partner_id Yes 'Must be an unique identifier from Reseller side' 'The partner_id provided at provision of the SendGrid account'%} + {% parameter partner_id Yes 'Must be a unique identifier from Reseller side' 'The partner_id provided at provision of the SendGrid account'%} {% parameter plan Yes 'New plan that the customer selected' 'SendGrid plan, which defines customer credits and permissions' %} {% endparameters %} diff --git a/source/API_Reference/Web_API/Reseller_Haiku_API/customer_provision.html b/source/API_Reference/Web_API/Reseller_Haiku_API/customer_provision.html index 265dcfab91..71dd4dd6d0 100644 --- a/source/API_Reference/Web_API/Reseller_Haiku_API/customer_provision.html +++ b/source/API_Reference/Web_API/Reseller_Haiku_API/customer_provision.html @@ -13,7 +13,7 @@ Create a SendGrid reseller customer account with a certain plan. {% parameters post %} - {% parameter partner_id Yes 'Must be an unique identifier from Reseller side' 'This can be an application_id, a user_id, or any other unique identifier of the SendGrid instance on your side'%} + {% parameter partner_id Yes 'Must be a unique identifier from Reseller side' 'This can be an application_id, a user_id, or any other unique identifier of the SendGrid instance on your side'%} {% parameter plan Yes 'Plan that the customer selected' 'SendGrid plan, which defines customer credits and permissions' %} {% parameter email No 'Customer email' 'Used as contact information for SendGrid support team'%} {% endparameters %} @@ -31,4 +31,4 @@ } } {% endv3response %} -{% endapiv3example %} \ No newline at end of file +{% endapiv3example %} diff --git a/source/API_Reference/Web_API/Reseller_Haiku_API/customer_sso.html b/source/API_Reference/Web_API/Reseller_Haiku_API/customer_sso.html index 49c882df8a..83a244980b 100644 --- a/source/API_Reference/Web_API/Reseller_Haiku_API/customer_sso.html +++ b/source/API_Reference/Web_API/Reseller_Haiku_API/customer_sso.html @@ -31,4 +31,4 @@ {% endv3response %} {% endapiv3example %} -If everything clears, we will redirect the user to our website. \ No newline at end of file +If everything clears, we will redirect the user to our website. diff --git a/source/API_Reference/Web_API/Reseller_Haiku_API/index.html b/source/API_Reference/Web_API/Reseller_Haiku_API/index.html index adf9c37d24..ca35e47f85 100644 --- a/source/API_Reference/Web_API/Reseller_Haiku_API/index.html +++ b/source/API_Reference/Web_API/Reseller_Haiku_API/index.html @@ -43,6 +43,6 @@

Change the package for a customer.

{% anchor h2 %} -Single Sign On +Single Sign On {% endanchor %}

Allow users to manage their account using our site

diff --git a/source/API_Reference/Web_API/blocks.md b/source/API_Reference/Web_API/blocks.md index abf6dd8a4d..b0bf4a07c8 100644 --- a/source/API_Reference/Web_API/blocks.md +++ b/source/API_Reference/Web_API/blocks.md @@ -28,34 +28,43 @@ Retrieve a list of Blocks with addresses and response codes, optionally with dat "status": "4.0.0", "created": "2012-09-02 00:12:12", "reason": "550 Access denied...04d52d35b93501d500a9bca895ddad5cddd1a9f8486c89ace8c5e959398198cd49cd58288c9d11313975284d852811... (throttled)", - "email": "example@juno.com" + "email": "example@example.com" }, { "status": "4.0.0", "created": "2012-09-02 00:21:29", "reason": "Connection timed out", - "email": "example2@band.la" + "email": "example@example.com" }, { "status": "4.0.0", "created": "2012-09-02 00:25:33", "reason": "Unable to resolve MX record for exampledomain.com: nxdomain", - "email": "example3@exampledomain.com" + "email": "example@example.com" } ] {% endresponse %} {% response xml %} - email1@domain.com + emaieexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaieexampexample@example.com 2009-06-10 12:40:30 - email2@domain2.com + emaileexampexample@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: emaileexampexample@example.com + example@example.com + 5.1.1 + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: example@example.com + 2009-06-10 12:40:30 + + + example@example.com + 5.1.1 + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: example@example.com 2009-08-01 10:16:30 diff --git a/source/API_Reference/Web_API/bounces.md b/source/API_Reference/Web_API/bounces.md index 065610593e..2d71f22af6 100644 --- a/source/API_Reference/Web_API/bounces.md +++ b/source/API_Reference/Web_API/bounces.md @@ -33,54 +33,50 @@ Retrieve a list of bounces with addresses and response codes, optionally with da "status": "4.0.0", "created": "2011-09-16 22:02:19", "reason": "Unable to resolve MX host sendgrid.ne", - "email": "esting@sendgrid.ne" + "email": "example@example.com" }, { "status": "4.0.0", "created": "2011-09-19 17:47:15", "reason": "Connection timed out", - "email": "rawest@gmail.co" + "email": "example@example.com" }, { "status": "5.1.1", "created": "2011-10-17 11:07:10", "reason": "550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at http://mail.google.com/support/bin/answer.py?answer=6596 z10si838244anz.171 ", - "email": "claims@msp.org" + "email": "example@example.com" }, { "status": "5.7.1", "created": "2011-10-26 23:06:22", + "reason": "550 5.7.1 ... Relaying denied. Proper authentication required. ", "reason": "550 5.7.1 ... Relaying denied. Proper authentication required. ", - "email": "info@bnl.co.uk" + "email": "example@example.com" }, { "status": "5.7.1", "created": "2011-12-01 01:45:55", + "reason": "554 5.7.1 : Relay access denied ", "reason": "554 5.7.1 : Relay access denied ", - "email": "richard@hengseng.com" + "email": "example@example.com" }, { "status": "550", "created": "2012-06-01 14:10:15", "reason": "550 support.sendgrid.net [74.63.202.100] is currently not permitted to relay through this server. Perhaps you have not logged into the pop/imap server in the last 30 minutes or do not have SMTP Authentication turned on in your email client. ", - "email": "test@brandonmwest.com" + "email": "example@example.com" } ] {% endresponse %} {% response xml %} - email1@domain.com + example@example.com 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email1@domain.com + host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: example@example.com 2009-06-10 12:40:30 - - email2@domain2.com - 5.1.1 - host [127.0.0.1] said: 550 5.1.1 unknown or illegal user: email2@domain2.com - 2009-08-01 10:16:30 - {% endresponse %} diff --git a/source/API_Reference/Web_API/filter_settings.md b/source/API_Reference/Web_API/filter_settings.md index 8d9f7d3e32..c2935c7b97 100644 --- a/source/API_Reference/Web_API/filter_settings.md +++ b/source/API_Reference/Web_API/filter_settings.md @@ -315,7 +315,7 @@ You must pass at least one of the optional params in order to avoid the "missing {% parameter 'name' 'Yes' 'subscriptiontrack' 'The setting.' %} {% parameter 'text/html' 'No' 'String for the HTML e-mail body' 'If you would like to unsubscribe and stop receiving these emails <% click here %>' %} {% parameter 'text/plain' 'No' 'String for the plain text e-mail body' 'If you would like to unsubscribe and stop receiving these emails click here: <% %>.' %} - {% parameter 'url' 'No' 'a URL the customer will be redirected to on clicking the subscription management link' 'http://www.example.com/UnsubscribeLandingPage' %} + {% parameter 'url' 'No' 'a URL the customer will be redirected to upon clicking the subscription management link' 'http://www.example.com/UnsubscribeLandingPage' %} {% parameter 'landing' 'No' 'HTML content for a landing page that will be displayed by SendGrid' '<html>Content</html>' %} {% parameter 'replace' 'No' 'a tag that can be added to the content that will be replaced by SendGrid with the subscription management link' '[unsubscribe_tag]' %} {% endparameters %} diff --git a/source/API_Reference/Web_API/mail.md b/source/API_Reference/Web_API/mail.md index e0bb177c91..40b79169af 100644 --- a/source/API_Reference/Web_API/mail.md +++ b/source/API_Reference/Web_API/mail.md @@ -37,7 +37,7 @@ You can have up to 10,000 recipients per Web API v2 request. While we do not enf {% endinfo %} {% parameters mail %} - {% parameter 'to' 'Yes' 'Must be a valid email address' 'This can also be passed in as an array, to send to multiple locations. Example: to[]=a@mail.com&to[]=b@mail.com. Note that recipients passed in this parameter will be visible as part of the message. If you wish to hide the recipients, use the TO parameter in the [x-smtpapi]({{root_url}}/API_Reference/SMTP_API/index.html) header.' %} + {% parameter 'to' 'Yes' 'Must be a valid email address' 'Specify a recipient email as a single email with this parameter. To send to multiple emails, use an array to specify each email, for example: `to[]=a@mail.com&to[]=b@mail.com`. You can also use the `To` parameter in the x-smtpapi header to add additional recipients. If you use the API `to` parameter to specify a single recipient, that recipient is visible in the `For` field of the received header - so if you specify a single address, it should be an address that you are comfortable with your customer seeing. For example, use a generic email address in the `to` field that your customer is already going to see, like your `from` address. To completely omit the email showing up in the `from` header: either specify multiple addresses in the `to` field as an array, for example, `to[]=a@mail.com&to[]=b@mail.com`, or use the V3 mail send endpoint.' %} {% parameter 'toname' 'No' 'Must be a string. If *to* parameter is an array, *toname* must be an array with the exact number of array elements as the *to* field' 'Give a name to the recipient. This can also be passed as an array if the to above is an array. Example: toname[]=Alpha[]=Beta.' %} {% parameter 'x-smtpapi' 'No' 'Must be in valid JSON format' 'Please review the [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html) to view documentation on what you can do with the JSON headers' %} {% parameter 'subject' 'Yes' 'Must be a valid string' 'The subject of your email' %} @@ -75,7 +75,7 @@ You can have up to 10,000 recipients per Web API v2 request. While we do not enf Call: Send to Multiple Recipients {% endanchor %} -{% apiexample multiple POST https://api.sendgrid.com/api/mail.send api_user=your_sendgrid_username&api_key=your_sendgrid_password&to[]=destination@example.com&toname[]=Destination&to[]=destination2@example.com&toname[]=Destination2&subject=Example_Subject&text=testingtextbody&from=info@domain.com false %} +{% apiexample multiple POST https://api.sendgrid.com/api/mail.send api_user=your_sendgrid_username&api_key=your_sendgrid_password&to[]=destination@example.com&toname[]=Destination&to[]=example@example.com&toname[]=Destination2&subject=Example_Subject&text=testingtextbody&from=info@domain.com false %} {% response json %} { "message": "success" @@ -144,7 +144,7 @@ Send to multiple email recipients {% endanchor %} {% codeblock lang:bash %} -curl -d 'to[]=destination@example.com&toname[]=Destination&to[]=destination2@example.com&toname[]=Destination2&subject=Example Subject&text=testingtextbody&from=info@domain.com&api_user=your_sendgrid_username&api_key=your_sendgrid_password' https://api.sendgrid.com/api/mail.send.json +curl -d 'to[]=destination@example.com&toname[]=Destination&to[]=example@example.com&toname[]=Destination2&subject=Example Subject&text=testingtextbody&from=info@domain.com&api_user=your_sendgrid_username&api_key=your_sendgrid_password' https://api.sendgrid.com/api/mail.send.json {% endcodeblock %} {% anchor h4 %} diff --git a/source/API_Reference/Web_API/profile.md b/source/API_Reference/Web_API/profile.md index d45ab3b147..fa358abfd2 100644 --- a/source/API_Reference/Web_API/profile.md +++ b/source/API_Reference/Web_API/profile.md @@ -16,8 +16,8 @@ get {% response json %} [ { - "username": "sampleuser@example.com", - "email": "sampleemail@example.com", + "username": "sampleuseexampexample@example.com", + "email": "example@example.com", "active": "true", "first_name": "john", "last_name": "doe", @@ -34,8 +34,8 @@ get {% response xml %} - sampleuser@example.com - sampleemail@example.com + sampleuseexampexample@example.com + example@example.com true john doe diff --git a/source/API_Reference/Web_API/spam_reports.md b/source/API_Reference/Web_API/spam_reports.md index 8335d4a7ed..7008ab7725 100644 --- a/source/API_Reference/Web_API/spam_reports.md +++ b/source/API_Reference/Web_API/spam_reports.md @@ -32,7 +32,7 @@ get }, { "ip": "74.63.202.105", - "email": "example2@yahoo.com", + "email": "example@example.com", "created": "2009-12-08 07:43:01" } ] @@ -46,7 +46,7 @@ get 74.63.202.105 - example2@yahoo.com + example@example.com 2009-12-08 07:43:01 diff --git a/source/API_Reference/Web_API/unsubscribes.md b/source/API_Reference/Web_API/unsubscribes.md index e3e0e09509..8c737d1d4a 100644 --- a/source/API_Reference/Web_API/unsubscribes.md +++ b/source/API_Reference/Web_API/unsubscribes.md @@ -28,7 +28,7 @@ Retrieve a list of Unsubscribes with addresses and optionally with dates. {% response json %} [ { - "email": "brandon.west@sendgrid.com", + "email": "example@example.com", "created": "2012-09-06 14:03:18" } ] @@ -36,7 +36,7 @@ Retrieve a list of Unsubscribes with addresses and optionally with dates. {% response xml %} - brandon.west@sendgrid.com + example@example.com 2012-09-06 14:03:18 diff --git a/source/API_Reference/Web_API/using_the_web_api.md b/source/API_Reference/Web_API/using_the_web_api.md index 5fa72cd887..a2176fb35a 100644 --- a/source/API_Reference/Web_API/using_the_web_api.md +++ b/source/API_Reference/Web_API/using_the_web_api.md @@ -114,7 +114,7 @@ https://api.sendgrid.com/api/blocks.get.json?api_user=your_sendgrid_username&api The Data {% endanchor %} -When you send data a GET request, it usually means that you're sending data in the URL's query string,the part after the '?' in the url, as a key/value pair. The key is defined by the place where you are sending the data and is assumed to be URL-safe, however the data you provide may not be. So, you should urlencode the value (or the data part) of any URL-passed information. +When you send data a GET request, it usually means that you're sending data in the URL's query string, the part after the '?' in the url, as a key/value pair. The key is defined by the place where you are sending the data and is assumed to be URL-safe, however the data you provide may not be. So, you should urlencode the value (or the data part) of any URL-passed information. For example, when you query google.com for "sendgrid.com/docs/" you get the following URL: diff --git a/source/API_Reference/Web_API_v3/API_Keys/index.apiblueprint b/source/API_Reference/Web_API_v3/API_Keys/index.apiblueprint index 98a823481d..a6f3d071ae 100644 --- a/source/API_Reference/Web_API_v3/API_Keys/index.apiblueprint +++ b/source/API_Reference/Web_API_v3/API_Keys/index.apiblueprint @@ -13,6 +13,8 @@ API Keys allow you to generate an API Key credential which can be used for authentication with the SendGrid v3 Web API, the [v3 Mail Send endpoint]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html), and the [v2 Mail Send endpoint]({{root_url}}/API_Reference/Web_API/mail.html). +{% info %} There is a limit of 100 API Keys per account. {% endinfo %} + # Group API Keys management ## API Keys collection [/api_keys] @@ -81,6 +83,8 @@ This will create a new random API Key for the user with permissions assigned. A } ] } + +{% info %} There is a limit of 100 API Keys per account. {% endinfo %} ## API Key [/api_keys/{api_key_id}] ### Get an existing API Key [GET] diff --git a/source/API_Reference/Web_API_v3/Categories/categories.md b/source/API_Reference/Web_API_v3/Categories/categories.md index fb7383f424..ad407ea393 100644 --- a/source/API_Reference/Web_API_v3/Categories/categories.md +++ b/source/API_Reference/Web_API_v3/Categories/categories.md @@ -31,4 +31,4 @@ HTTP/1.1 200 {"category": "cat5"} ] {% endv3response %} -{% endapiv3example %} \ No newline at end of file +{% endapiv3example %} diff --git a/source/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/authentication.md b/source/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/authentication.md index e265be6308..057e920af9 100644 --- a/source/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/authentication.md +++ b/source/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/authentication.md @@ -41,22 +41,22 @@ The on-behalf-of header allows you to make calls for a particular subuser throug This will generate the api call as if it was the subuser account itself making the call. Just make sure you are using the correct subuser username. -When authenticating using the on-behalf-of header, you will need to use the API key or basic auth credentials of the parent account. +When authenticating using the on-behalf-of header, you will need to use the API key credentials of the parent account. {% anchor h3 %} Using API Key: {% endanchor %} - + {% codeblock lang:bash %} curl -X GET \ 'https://api.sendgrid.com/v3/stats?start_date=2016-01-01&end_date=2017-01-01&aggregated_by=month' \ - + -H 'authorization: Bearer API Key' \ - + -H 'on-behalf-of: subuser_username' \ {% endcodeblock %} - + {% warning %} Please note: The on-behalf-of header will not work with the `mail.send` API. {% endwarning %} diff --git a/source/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/requests.md b/source/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/requests.md index 88d0a9315f..6e61b0ec82 100644 --- a/source/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/requests.md +++ b/source/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/requests.md @@ -43,7 +43,7 @@ Depending on the resource, we support the following HTTP verbs:
- + @@ -67,9 +67,7 @@ Depending on the resource, we support the following HTTP verbs: Accept Header {% endanchor %} -The API provides JSON responses. The [accept header](http://www.soapui.org/Best-Practices/understanding-rest-headers-and-parameters.html) is not currently -required, though it may be required in the future. If not set, the -API will use `application/json`. +The API provides JSON responses. The [accept header](http://www.soapui.org/Best-Practices/understanding-rest-headers-and-parameters.html) is currently required for some API calls, and is recommended for all of them. It should be set to `application/json`. {% codeblock lang:http %} GET https://api.sendgrid.com/v3/endpoint HTTP/1.1 diff --git a/source/API_Reference/Web_API_v3/IP_Management/ip_addresses.md b/source/API_Reference/Web_API_v3/IP_Management/ip_addresses.md index 706afac83d..e38fa89ef7 100644 --- a/source/API_Reference/Web_API_v3/IP_Management/ip_addresses.md +++ b/source/API_Reference/Web_API_v3/IP_Management/ip_addresses.md @@ -9,29 +9,50 @@ navigation: {% anchor h2 %} POST {% endanchor %} -Add an IP to a pool. - -{% info %} -An IP may belong to multiple pools. It may take 60 seconds for your IP -address to be added to a pool after your request is made. -{% endinfo %} +Add IP Addresses. {% parameters post %} - {% parameter ip Yes 'Valid IP address' 'IP address to add to the pool' %} + {% parameter count Yes Integer 'The amount of IPs to add to the account.' %} + {% parameter subuser No String 'Array of usernames to be assigned a send IP.' %} {% endparameters %} -{% apiv3example post POST https://api.sendgrid.com/v3/ips/pools/:pool_name/ips ip=0.0.0.0 %} - {% v3response %} +{% apiv3example post POST https://api.sendgrid.com/v3/ips %} + +{% apiv3requestbody %} +{ + "count": 2, + "subusers": [ + "subuser1", + "subuser2" + ], + "warmup": true, + "user_can_send": true +} +{% endapiv3requestbody %} + +{% v3response %} HTTP/1.1 201 OK -{ -"ip": "000.00.00.0", -"pools": [ -"test1" -], -"start_date": 1409616000, -"warmup": true -} +{ + "ips": [ + { + "ip": "1.2.3.4", + "subusers": [ + "user", + "subuser1" + ] + }, + { + "ip": "1.2.3.5", + "subusers": [ + "user", + "subuser1" + ] + } + ], + "remaining_ips": 1, + "warmup": true +} {% endv3response %} {% endapiv3example %} @@ -40,7 +61,31 @@ HTTP/1.1 201 OK {% anchor h2 %} GET {% endanchor %} -See a list of all assigned and unassigned IPs. Response includes warm up status, pools, assigned subusers, and whitelabel info. +Get amount of IP Addresses that can still be created during a given period and the price of those IPs. + +{% apiv3example get GET https://api.sendgrid.com/v3/ips/remaining %} +{% v3response %} +HTTP/1.1 200 OK + +[ + { + "results": [ + { + "remaining": 2, + "period": "month", + "price_per_ip": 30 + } + ] + +{% endv3response %} +{% endapiv3example %} + +* * * * * + +{% anchor h2 %} +GET +{% endanchor %} +See a list of all assigned and unassigned IPs. Response includes warm up status, pools, assigned subusers, and whitelabel info. The start_date field corresponds to when warmup started for that IP. {% apiv3example get GET https://api.sendgrid.com/v3/ips %} @@ -89,7 +134,7 @@ GET {% endanchor %} See which pools an IP address belongs to. -{% apiv3example get-specific GET https://api.sendgrid.com/v3/ips/0.0.0.0 %} +{% apiv3example get-specific GET https://api.sendgrid.com/v3/ips/{ip_address}%} {% v3response %} HTTP/1.1 200 OK @@ -108,16 +153,3 @@ HTTP/1.1 200 OK {% endv3response %} {% endapiv3example %} - -* * * * * - -{% anchor h2 %} -DELETE -{% endanchor %} -Remove an IP address from a pool. - -{% apiv3example delete DELETE https://api.sendgrid.com/v3/ips/pools/:pool_name/ips/:ip %} - {% v3response %} -HTTP/1.1 204 NO CONTENT (OK) - {% endv3response %} -{% endapiv3example %} diff --git a/source/API_Reference/Web_API_v3/IP_Management/ip_pools.md b/source/API_Reference/Web_API_v3/IP_Management/ip_pools.md index 67ae674247..d1554ca0fe 100644 --- a/source/API_Reference/Web_API_v3/IP_Management/ip_pools.md +++ b/source/API_Reference/Web_API_v3/IP_Management/ip_pools.md @@ -57,7 +57,7 @@ There is a limit of 100 IP pools per user. {% anchor h2 %} GET {% endanchor %} -List all IP pools. +Retrieve all IP pools. {% apiv3example get GET https://api.sendgrid.com/v3/ips/pools %} {% v3response %} @@ -85,9 +85,9 @@ HTTP/1.1 200 {% anchor h2 %} GET {% endanchor %} -List the IPs in a specified pool. +Retrieve all IPs in a specified pool. -{% apiv3example get-specific GET https://api.sendgrid.com/v3/ips/pools/:pool_name %} +{% apiv3example get-specific GET https://api.sendgrid.com/v3/ips/pools/{pool_name} %} {% v3response %} HTTP/1.1 200 OK @@ -109,7 +109,7 @@ Update an IP pool's name. {% parameter name Yes 'String. max 64 characters' 'New name of the pool' %} {% endparameters %} -{% apiv3example put PUT https://api.sendgrid.com/v3/ips/pools/:pool_name name=new_pool_name %} +{% apiv3example put PUT https://api.sendgrid.com/v3/ips/pools/{pool_name} name=new_pool_name %} {% apiv3requestbody %} {"name":"marketing"} {% endapiv3requestbody %} @@ -124,14 +124,54 @@ HTTP/1.1 200 OK * * * * * +{% anchor h2 %} +POST +{% endanchor %} +Add an IP Address to a pool. + +{% apiv3example post POST https://api.sendgrid.com/v3/ips/pools/{pool_name}/ips %} + +{% apiv3requestbody %} {"ip":"0.00.0.0"} {% endapiv3requestbody %} + +{% v3response %} +HTTP/1.1 200 OK + +{ + "ip": "0.00.0.0", + "pools": [ + "marketing" + ], + "start_date": null, + "warmup": false +} +{% endv3response %} +{% endapiv3example %} + +* * * * * + +{% anchor h2 %} +DELETE +{% endanchor %} +Remove an IP Address from a pool. + +{% apiv3example delete DELETE https://api.sendgrid.com/v3/ips/pools/{pool_name}/ips/{ip} %} + +{% v3response %} +HTTP/1.1 204 NO CONTENT (OK) +{% endv3response %} +{% endapiv3example %} + +* * * * * + {% anchor h2 %} DELETE {% endanchor %} Delete an IP pool. -{% apiv3example delete DELETE https://api.sendgrid.com/v3/ips/pools/:pool_name %} - {% v3response %} +{% apiv3example delete DELETE https://api.sendgrid.com/v3/ips/pools/{pool_name} %} + +{% v3response %} HTTP/1.1 204 NO CONTENT (OK) - {% endv3response %} +{% endv3response %} {% endapiv3example %} diff --git a/source/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.md b/source/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.md deleted file mode 100644 index 43ca60aa03..0000000000 --- a/source/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.md +++ /dev/null @@ -1,407 +0,0 @@ ---- -layout: page -title: SendGrid Automated IP Warmup Schedule -seo: - title: SendGrid Automated IP Warmup Schedule -weight: 60 -navigation: - show: true ---- - -{% info %} -If you are looking for a suggested IP Warmup Schedule, [please download our IP Warmup Schedule PDF](https://sendgrid.com/docs/assets/IPWarmupSchedule.pdf). -{% endinfo %} - -The following schedule shows the automatic hourly warmup schedule and email limits that SendGrid will use to -warmup your IP addresses when used with [IP warmup feature]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup.html). - -Any email traffic exceeding these hourly message limits will be sent through your other warm dedicated IP Addresses. If you don't have any other warm dedicated IP Addresses, you will need to manually warmup following the [IP Warmup Guide](https://sendgrid.com/docs/assets/IPWarmupSchedule.pdf). - -
GETRetrieve a resource or group of resoucesRetrieve a resource or group of resources
POST
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Warmup Age (Days) - - Hourly Email Limit -
- 0 - - 20 -
- 1 - - 28 -
- 2 - - 39 -
- 3 - - 55 -
- 4 - - 77 -
- 5 - - 108 -
- 6 - - 151 -
- 7 - - 211 -
- 8 - - 295 -
- 9 - - 413 -
- 10 - - 579 -
- 11 - - 810 -
- 12 - - 1,000 -
- 13 - - 1,587 -
- 14 - - 2,222 -
- 15 - - 3,111 -
- 16 - - 4,356 -
- 17 - - 6,098 -
- 18 - - 8,583 -
- 19 - - 11,953 -
- 20 - - 16,734 -
- 21 - - 23,427 -
- 22 - - 32,798 -
- 23 - - 45,917 -
- 24 - - 64,284 -
- 25 - - 89,998 -
- 26 - - 125,997 -
- 27 - - 176,395 -
- 28 - - 246,953 -
- 29 - - 345,735 -
- 30 - - 484,029 -
- 31 - - 677,640 -
- 32 - - 948,696 -
- 33 - - 1,328,175 -
- 34 - - 1,859,444 -
- 35 - - 2,603,222 -
- 36 - - 3,644,511 -
- 37 - - 5,102,316 -
- 38 - - 7,143,242 -
- 39 - - 10,000,539 -
- 40 - - 14,000,754 -
- 41 - - 19,601,056 -
diff --git a/source/API_Reference/Web_API_v3/Mail/errors.md b/source/API_Reference/Web_API_v3/Mail/errors.md index 946d10d1a8..f47baced3e 100644 --- a/source/API_Reference/Web_API_v3/Mail/errors.md +++ b/source/API_Reference/Web_API_v3/Mail/errors.md @@ -364,7 +364,7 @@ From Address Errors {% api_error_table_message "The from object must at least have an email parameter with a valid email address and may also contain a name parameter. e.g. {"email": "example@example.com"} or {"email": "example@example.com", "name": "Example Recipient"}" "While every from parameter must include a valid email address, you are not required to include a name." %} - {% api_error_table_message "The from object must be provided for every email send. It is an object that requires the email parameter, but may also contain a name parameter. e.g. {"email": "example@example.com"} or {"email": "example@example.com", "name": "Example Recipient"}" "You are required to provide a from address whenever you send an email through SendGrid. This is used for authentication purposes and helps to build a positive sending reputation with your recipients' ISPs. You are not required to include a name within the from parameter." %} + {% api_error_table_message "The from object must be provided for every email send. It is an object that requires the email parameter, but may also contain a name parameter. e.g. {"email": "example@example.com"} or {"email": "example@example.com", "name": "Example Recipient"}" "You are required to provide a from address whenever you send an email through SendGrid. This is used for authentication purposes and helps to build a positive sending reputation with your recipients' ISPs. You are not required to include a name within the from parameter." %} {% api_error_table_message "The From email exceeds the maximum total length of 320 characters" "We only allow the total email length to be 320 characters including the local address, the `@`, and the domain." %} diff --git a/source/API_Reference/Web_API_v3/Mail/index.html b/source/API_Reference/Web_API_v3/Mail/index.html index 8bc28a0c33..109914b1d4 100644 --- a/source/API_Reference/Web_API_v3/Mail/index.html +++ b/source/API_Reference/Web_API_v3/Mail/index.html @@ -72,7 +72,7 @@
  • The total size of your email, including attachments, must be less than 30MB.
  • The total number of recipients must be less than 1000. This includes all recipients defined within the to, cc, and bcc parameters, across each object that you include in the personalizations array.
  • -
  • 3000 requests/sec is the maximum rate at which you may call v3 Mail endpoint.
  • +
  • 10,000 requests/sec is the maximum rate at which you may call v3 Mail endpoint.
  • The total length of custom arguments must be less than 10000 bytes.
  • Unicode encoding is not supported for the from field within the personalizations array.
  • The to.name, cc.name, and bcc.name personalizations cannot include either the ; or , characters.
  • @@ -109,7 +109,7 @@ {% api_table_param headers "object" No "" "An object allowing you to specify specific handling instructions for your email." 1 %} {% api_table_param substitutions "object" No "Max 100 substitutions, or 10K bytes, per personalization object." "An object following the pattern "substitution_tag":"value to substitute". All are assumed to be strings. These substitutions will apply to the content of your email, in addition to the subject and reply-to parameters.

    You may not include more than 100 substitutions per personalization object, and the total collective size of your substitutions may not exceed 10,000 bytes per personalization object." 1 %} {% api_table_param custom_args "object" No "May not exceed 10,000 bytes" "These are values that are specific to this personalization that will be carried along with the email, activity data, and links. Substitutions will not be made on custom arguments. personalizations[x].custom_args will be merged with message level custom_args, overriding any conflicting keys. The combined total size of the resulting custom arguments, after merging, for each personalization may not exceed 10,000 bytes." 1 %} - {% api_table_param send_at integer No "Value in seconds (not ms)" "A unix timestamp allowing you to specify when you want your email to be sent from SendGrid. This is not necessary if you want the email to be sent at the time of your API request." 1 %} + {% api_table_param send_at integer No "Value in seconds (not ms)" "A unix timestamp allowing you to specify when you want your email to be sent from SendGrid. If you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid those times (for example, scheduling at 10:53) can result in lower deferral rates because it won't be going through our servers at the same times as everyone else's mail." 1 %} {% api_table_param from "object" Yes "May not include Unicode encoding." "An email object containing the email address and name of the sender. Unicode encoding is not supported for the from field." 0 %} {% api_table_param email string Yes "" "The email address of the sender." 1 %} {% api_table_param name string No "" "The name of the sender." 1 %} @@ -157,7 +157,7 @@ {% api_table_param click_tracking object No "" "Allows you to track whether a recipient clicked a link in your email." 1 %} {% api_table_param enable boolean No "true or false" "Indicates if this setting is enabled." 2 %} {% api_table_param enable_text boolean No "true or false" "Indicates if this setting should be included in the text/plain portion of your email." 2 %} - {% api_table_param open_tracking object No "" "Allows you to track whether the email was opened or not, but including a single pixel image in the body of the content. When the pixel is loaded, we can log that the email was opened." 1 %} + {% api_table_param open_tracking object No "" "Allows you to track whether the email was opened or not, by including a single pixel image in the body of the content. When the pixel is loaded, we can log that the email was opened." 1 %} {% api_table_param enable boolean No "true or false" "Indicates if this setting is enabled." 2 %} {% api_table_param substitution_tag string No "" "Allows you to specify a substitution tag that you can insert in the body of your email at a location that you desire. This tag will be replaced by the open tracking pixel." 2 %} {% api_table_param subscription_tracking object No "" "Allows you to insert a subscription management link at the bottom of the text and html bodies of your email. If you would like to specify the location of the link within your email, you may use the substitution_tag." 1 %} @@ -173,3 +173,28 @@ {% api_table_param utm_content string No "" "Used to differentiate your campaign from advertisements." 2 %} {% api_table_param utm_campaign string No "" "The name of the campaign." 2 %} {% endapi_table %} +{% anchor h2 %} +Response Example +{% endanchor %} + +{% codeblock %} +Response Code: 202 Accepted +Response Headers: + Access-Control-Allow-Headers →Authorization, Content-Type, On-behalf-of, x-sg-elas-acl + Access-Control-Allow-Methods →POST + Access-Control-Allow-Origin →https://sendgrid.api-docs.io + Access-Control-Max-Age →600 + Connection →keep-alive + Content-Length →0 + Content-Type →text/plain; charset=utf-8 + Date →Mon, 23 Oct 2017 23:09:41 GMT + Server →nginx + X-Message-Id →kA5kcHA8SVGtVh5S9rAUew + X-No-CORS-Reason →https://sendgrid.com/docs/Classroom/Basics/API/cors.html +Response Body: + +{% endcodeblock %} + +{% info %} +If you are using the Event Webhook, it's best practice to store your [X-Message-ID](https://sendgrid.com/docs/Glossary/x_message_id.html) data help with deduplications in your webhook data. +{% endinfo %} diff --git a/source/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.apiblueprint b/source/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.apiblueprint index 8078960216..08f9f4a180 100644 --- a/source/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.apiblueprint +++ b/source/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.apiblueprint @@ -44,6 +44,8 @@ A campaign requires a title to be created. In order to send or schedule the campaign, you will be required to provide a subject, sender ID, content (we suggest both html and plain text), and at least one list or segment ID. {% endinfo %} +{% warning %} We require that both the html and plain text content have an `[unsubscribe]` tag in them.{% endwarning %} + ### Create a Campaign [POST] + Request (application/json) @@ -454,7 +456,7 @@ To send to multiple addresses, use an array for the JSON "to" value ["one@addres + Body { - "to": "your.email@example.com" + "to": "example@example.com" } + Response 204 diff --git a/source/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.apiblueprint b/source/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.apiblueprint index ee8b28644e..eaacc698c7 100644 --- a/source/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.apiblueprint +++ b/source/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.apiblueprint @@ -77,6 +77,10 @@ Treat recipient IDs as opaque values. The `id` value returned by recipient endpo Recipient IDs are generated by encoding the recipient's email address in Base64 format. You can use any Base64 encoder/decoder, for example https://www.base64encode.org/, to convert a recipient ID to the recipient's email address (and vice versa). {% endinfo %} +{% info %} +The `page_size` argument available on some calls is a "fuzzy" value. Due to how our datastore works, you may receive slightly more or less than the stated value. +{% endinfo %} + # Group Custom Fields ## Custom Fields [/contactdb/custom_fields] @@ -102,6 +106,9 @@ Recipient IDs are generated by encoding the recipient's email address in Base64 "type" : "Returned if custom field type is invalid or not provided" "name" : "Returned if custom field name is not provided" +You can create a maximum of 120 custom fields. + + ### List All Custom Fields [GET] + Response 200 @@ -311,7 +318,7 @@ Returned if one or more lists were deleted + Body - {"recipients":[{"created_at":1422395108,"email":"e@example.com","first_name":"Ed","id":"YUBh","last_clicked":null,"last_emailed":null,"last_name":null,"last_opened":null,"updated_at":1422395108}]} + {"recipients":[{"created_at":1422395108,"email":"eexampexample@example.com","first_name":"Ed","id":"YUBh","last_clicked":null,"last_emailed":null,"last_name":null,"last_opened":null,"updated_at":1422395108}]} + Response 400 @@ -424,13 +431,13 @@ If you make a request to upload a duplicate recipient and your request would mak ### Add Single Recipient [POST] -The rate at which recipients may be uploaded is limited to 3 requests every 2 seconds. Recipients may be uploaded in batches of 1000 per request. This results in a maximum upload rate of 1500 recipients per second. +The rate at which recipients may be uploaded is limited to 3 requests per second. Recipients may be uploaded in batches of 1000 per request. This results in a maximum upload rate of 1500 recipients per second. + Request (application/json) + Body - [{"email": "jones@example.com", "last_name": "Jones", "pet": "Fluffy", "age": 25}] + [{"email": "example@example.com", "last_name": "Jones", "pet": "Fluffy", "age": 25}] + Response 201 @@ -452,8 +459,8 @@ The rate at which recipients may be uploaded is limited to 3 requests every 2 se + Body [ - {"email": "jones@example.com", "last_name": "Jones", "pet": "Fluffy", "age": 25}, - {"email": "miller@example.com", "last_name": "Miller", "pet": "FrouFrou", "age": 32}, + {"email": "example@example.com", "last_name": "Jones", "pet": "Fluffy", "age": 25}, + {"email": "milleexampexample@example.com", "last_name": "Miller", "pet": "FrouFrou", "age": 32}, {"email": "invalid_email", "last_name": "Smith", "pet": "Spot", "age": 17}, {"email": "pre-existing_email@example.com"} ] @@ -472,14 +479,14 @@ The rate at which recipients may be uploaded is limited to 3 requests every 2 se ### Update Recipient [PATCH] -Updates one or more recipients. The body is a list of recipient objects. +Updates one or more recipients. If the recipient does not exist, it will be created. The body is a list of recipient objects. + Request (application/json) + Body [ - {"email": "jones@example.com", "last_name": "Jones"}, + {"email": "new-email@example.com", "last_name": "Jones"}, {"email": "pre-existing_email@example.com"} ] @@ -499,6 +506,10 @@ Updates one or more recipients. The body is a list of recipient objects. Deletes one or more recipients. The body is a list of recipient ids to delete. +{% warning %} +Use this to permanently delete your recipients from all of your contact lists and all segments if required by applicable law. +{% endwarning %} + + Request (application/json) + Body @@ -535,7 +546,7 @@ the list of recipients. To avoid this issue; iterate over pages until a 404 is r + Body - {"recipients": [{"created_at":1422313607,"email":"jones@example.com","first_name":null,"id":"YUBh","last_clicked":null,"last_emailed":null,"last_name":"Jones","last_opened":null,"updated_at":1422313790,"custom_fields":[{"id":23,"name":"pet","value":"Indiana","type":"text"}]}]} + {"recipients": [{"created_at":1422313607,"email":"example@example.com","first_name":null,"id":"YUBh","last_clicked":null,"last_emailed":null,"last_name":"Jones","last_opened":null,"updated_at":1422313790,"custom_fields":[{"id":23,"name":"pet","value":"Indiana","type":"text"}]}]} + Response 400 @@ -565,7 +576,7 @@ the list of recipients. To avoid this issue; iterate over pages until a 404 is r { "created_at": 1422313607, - "email": "jones@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBh", "last_clicked": null, @@ -694,6 +705,10 @@ Search with conditions [POST] Field values must all be a string.

    +{% info %} +You can search for up to 15 different conditions per request. +{% endinfo %} +

    Search conditions using "eq" or "ne" for email clicks and opens should provide a "field" of either clicks.campaign_identifier or opens.campaign_identifier. The condition value should be a string containing the id of a completed campaign. @@ -704,6 +719,7 @@ Search with conditions [POST] The first condition in the conditions list must have an empty "and_or", and subsequent conditions must all specify an "and_or".

    + + Request + Body @@ -726,7 +742,7 @@ Search with conditions [POST] {"recipients": [{ "created_at": 1422313607, - "email": "jones@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBh", "last_clicked": 12345, @@ -778,7 +794,7 @@ Search with conditions [POST] {"recipients": [{ "created_at": 1422313607, - "email": "jones@example.com", + "email": "example@example.com", "first_name": null, "id": "YUBh", "last_clicked": null, @@ -812,7 +828,7 @@ Search with conditions [POST]

    {% info %} -The JSON accepted by this endpoint is identical to that of the [POST search with conditions](#-Search-with-conditions-POST), with the addition of requiring a unique name. (POST search with conditions is described above.) +The JSON accepted by this endpoint is identical to that of the [POST search with conditions](#-Search-with-conditions-POST), with the addition of requiring a unique name. (POST search with conditions is described above.) {% endinfo %} ## Segments [/contactdb/segments] @@ -840,7 +856,11 @@ The JSON accepted by this endpoint is identical to that of the [POST search with {"id":1,"name":"Last Name Miller","list_id":4,"conditions":[{"field":"last_name", "value":"Miller", "operator":"eq", "and_or":""},{"field":"last_clicked", "value":"01/02/2015", "operator": "gt", "and_or": "and"},{"field": "clicks.campaign_identifier", "value": "513", "operator": "eq", "and_or": "or"}], "recipient_count":0} -{% warning %}The response of the initial `POST` will return a `recipient_count` of 0 because it takes some time to populate. Follow up with a `GET` to verfiy segment size.{% endwarning %} +{% warning %}The response of the initial `POST` will return a `recipient_count` of 0 because it takes some time to populate. Follow up with a `GET` to verify segment size.{% endwarning %} + +{% info %} +You can add up to 15 different conditions per segment. +{% endinfo %} + Response 400 @@ -860,6 +880,9 @@ The JSON accepted by this endpoint is identical to that of the [POST search with ### List All Segments [GET] ++ Parameters + + exclude = "count" (optional, string) ... add this argument if you don't need the Segment `recipient_count` value updated. This will speed up the query return. + + Response 200 + Body @@ -966,7 +989,7 @@ The JSON accepted by this endpoint is identical to that of the [POST search with + Body - {"recipients":[{"created_at": 1422313607,"email": "jones@example.com","first_name": null,"id": "YUBh","last_clicked": null,"last_emailed": null,"last_name": "Jones","last_opened": null,"updated_at": 1422313790,"custom_fields": [{ "id": 23, "name": "pet", "value": "Indiana", "type": "text"}]}]} + {"recipients":[{"created_at": 1422313607,"email": "example@example.com","first_name": null,"id": "YUBh","last_clicked": null,"last_emailed": null,"last_name": "Jones","last_opened": null,"updated_at": 1422313790,"custom_fields": [{ "id": 23, "name": "pet", "value": "Indiana", "type": "text"}]}]} + Response 400 diff --git a/source/API_Reference/Web_API_v3/Marketing_Campaigns/sender_identities.md b/source/API_Reference/Web_API_v3/Marketing_Campaigns/sender_identities.md index 84079368fd..6775a463a1 100644 --- a/source/API_Reference/Web_API_v3/Marketing_Campaigns/sender_identities.md +++ b/source/API_Reference/Web_API_v3/Marketing_Campaigns/sender_identities.md @@ -34,7 +34,7 @@ Sender Identities are required to be verified before use. If your domain has bee "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", @@ -55,7 +55,7 @@ Sender Identities are required to be verified before use. If your domain has bee "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", @@ -90,7 +90,7 @@ This endpoint allows you to retrieve a list of all of your sender identities. "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", @@ -127,7 +127,7 @@ Partial updates are allowed, but fields that are marked as "required" in the POS "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", @@ -148,7 +148,7 @@ Partial updates are allowed, but fields that are marked as "required" in the POS "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", @@ -208,7 +208,7 @@ This endoint allows you to retrieve a specific sender identity. "name": "Example INC" }, "reply_to": { - "email": "replyto@example.com", + "email": "example@example.com", "name": "Example INC" }, "address": "123 Elm St.", diff --git a/source/API_Reference/Web_API_v3/Settings/enforced_tls.md b/source/API_Reference/Web_API_v3/Settings/enforced_tls.md index 32910f0e3d..1b1503f887 100644 --- a/source/API_Reference/Web_API_v3/Settings/enforced_tls.md +++ b/source/API_Reference/Web_API_v3/Settings/enforced_tls.md @@ -12,7 +12,7 @@ support TLS or have a valid certificate. See the information on opportunistic TLS. {% info %} -If either setting is enabled and the recipient does not support TLS or have a +If either setting is enabled and the recipient does not support TLS 1.1 or higher or have a valid certificate, we drop the message and send a block event with "TLS required but not supported" as the description. {% endinfo %} diff --git a/source/API_Reference/Web_API_v3/Stats/advanced.md b/source/API_Reference/Web_API_v3/Stats/advanced.md index d43ebdad06..dc54e214ef 100644 --- a/source/API_Reference/Web_API_v3/Stats/advanced.md +++ b/source/API_Reference/Web_API_v3/Stats/advanced.md @@ -6,10 +6,6 @@ navigation: show: true --- -{% info %} -We store 7 days of email activity in our database and the default is 500 items returned per request via these API endpoints. -{% endinfo %} - Advanced Stats provide a more in-depth view of your statistics and the actions of the recipients segmented by geography, browser type, and more. You can read more about them in the [Statistics]({{root_url}}/User_Guide/Statistics/index.html) section of our User Guide. {% anchor h2 %} diff --git a/source/API_Reference/Web_API_v3/Stats/subusers.md b/source/API_Reference/Web_API_v3/Stats/subusers.md index 28aca2f0ce..f876436abf 100644 --- a/source/API_Reference/Web_API_v3/Stats/subusers.md +++ b/source/API_Reference/Web_API_v3/Stats/subusers.md @@ -12,7 +12,7 @@ Subuser Stats provide all of your user's email statistics for your subuser accou GET {% endanchor %} -Gets email statistics for the given subusers. You can add up to 10 `subusers` parameters, one for each subuser you want stats for. +Gets email statistics for the given subusers. You can add up to 10 `subusers` parameters, one for each subuser you want stats for. {% parameters get %} {% parameter start_date Yes 'Date formatted as YYYY-MM-DD' 'The starting date of the statistics to retrieve' %} diff --git a/source/API_Reference/Web_API_v3/Suppression_Management/global_suppressions.apiblueprint b/source/API_Reference/Web_API_v3/Suppression_Management/global_suppressions.apiblueprint index c51a17f38e..bb71d2dfb3 100644 --- a/source/API_Reference/Web_API_v3/Suppression_Management/global_suppressions.apiblueprint +++ b/source/API_Reference/Web_API_v3/Suppression_Management/global_suppressions.apiblueprint @@ -32,7 +32,7 @@ Global Unsubscribes are email addresses that will not receive any emails. }, { "created": 1443651154, - "email": "user2@example.com" + "email": "exampexample@example.comom" } ] @@ -82,3 +82,37 @@ If the email address does not belongs to the Global Unsubscribes collection: ### Remove an email address from the Global Unsubscribes collection [DELETE] + Response 204 (application/json) + +## Global Unsubscribes Collection [/suppression/unsubscribes] + +### Remove multiple email addresses from the Global Unsubscribes collection [DELETE] + +{%info%} +Maximum of 500 addresses in the `emails` Array. +{%endinfo%} + ++ Request (application/json) + + + Body + + { + "emails": [ + "test1@example.com", + "test2@example.com" + ] + } + ++ Response 204 (application/json) + +## Global Unsubscribes Collection [/suppression/unsubscribes] + +### Remove all email addresses from the Global Unsubscribes collection [DELETE] ++ Request (application/json) + + + Body + + { + "delete_all": true + } + ++ Response 204 (application/json) diff --git a/source/API_Reference/Web_API_v3/Suppression_Management/groups.md b/source/API_Reference/Web_API_v3/Suppression_Management/groups.md index f7583f38b5..32c7522537 100644 --- a/source/API_Reference/Web_API_v3/Suppression_Management/groups.md +++ b/source/API_Reference/Web_API_v3/Suppression_Management/groups.md @@ -173,7 +173,6 @@ DELETE Delete a suppression group. {% info %} -You can only delete groups that have not been attached to sent mail in the last 60 days. If a recipient uses the "one-click unsubscribe" option on an email associated with a deleted group, that recipient will be added to the global suppression list. diff --git a/source/API_Reference/Web_API_v3/Transactional_Templates/index.md b/source/API_Reference/Web_API_v3/Transactional_Templates/index.md index 8fb41db437..35e0414bf8 100644 --- a/source/API_Reference/Web_API_v3/Transactional_Templates/index.md +++ b/source/API_Reference/Web_API_v3/Transactional_Templates/index.md @@ -18,7 +18,7 @@ Templates are re-usable email layouts, that may be created and interacted with t Templates may have multiple versions with different content, these may be changed and activated through the API. These allow split testing, multiple languages of the same template, etc. -**[Sending Transactional Templates]({{root_url}}/API_Reference/Web_API_v3/Transactional_Templates/smtpapi.html)** +**Sending Transactional Templates** You can send transactional templates using one of three ways: diff --git a/source/API_Reference/Web_API_v3/Tutorials/getting_started_email_activity_api.md b/source/API_Reference/Web_API_v3/Tutorials/getting_started_email_activity_api.md new file mode 100644 index 0000000000..b285b6aee7 --- /dev/null +++ b/source/API_Reference/Web_API_v3/Tutorials/getting_started_email_activity_api.md @@ -0,0 +1,310 @@ +--- +seo: + title: Getting Started with the Email Activity Feed API + description: Use the Email Activity Feed query language to get started with the Email Activity Feed API. + keywords: email activity, query language, email stats, email events +title: Getting Started with the Email Activity Feed API +weight: 0 +layout: page +navigation: + show: true +--- +{% info %} +In order to gain access to the Email Activity Feed API, you must purchase [additional email activity history](https://app.sendgrid.com/settings/billing/addons/email_activity). +{% endinfo %} + +- [Getting started](#-Getting-started) + - [Encoding queries](#-Encoding-queries) +- [Queries for common use cases](#-Queries-for-common-use-cases) + - [Filter by subject](#-Filter-by-subject) + - [Filter by recipient email](#-Filter-by-recipient-email) + - [Filter by bounced emails](#-Filter-by-bounced-emails) +- [Creating compound queries](#-Creating-compound-queries) + - [Filter by a recipient email that was bounced](#-Filter-by-a-recipient-email-that-was-bounced) + - [Filter by date range](#-Filter-by-date-range) + - [Filter by a recipient and and a date range](#-Filter-by-a-recipient-and-a-date-range) +- [Keyword and Operator reference](#-Keyword-and-Operator-reference) +- [Query reference](#-Query-reference) + +The API gives you access to query all of your stored messages, to query individual messages, and to download a CSV with data about the stored messages. + +{% anchor h2 %} +Getting started +{% endanchor %} + +Start with this basic query to the Email Activity Feed API (replace `<>` with an API key from your account): + +{% codeblock %} +curl --request GET \ + --url 'http://api.sendgrid.com/v3/messages?limit=10' \ + --header 'authorization: Bearer <>' +{% endcodeblock %} + +This returns a list of the 10 most recent emails you've sent. Next, check out some of the common use cases to narrow down your search. + +{% anchor h3 %} +Encoding queries +{% endanchor %} + +All queries need to be [URL encoded](https://meyerweb.com/eric/tools/dencoder/), and have this format: + +`query={query_type}="{query_content}"` + +Encoded, this query would look like this: + +`query=query_type%3D%22query_content%22` + +{% anchor h2 %} +Queries for common use cases +{% endanchor %} + +Here are some queries for common use cases. For a full list of possible query types, see the [query reference](#-Query-reference). + +{% anchor h3 %} +Filter by subject +{% endanchor %} + +Use this query to filter by email subject (replace `<>` with an API key from your account, and replace <> with the subject you want to search): + +{% codeblock %} +curl --request GET \ + --url 'https://api.sendgrid.com/v3/messages?limit=10&query=subject%3D<>' \ + --header 'authorization: Bearer <>' +{% endcodeblock %} + +Subject queries have this format: + +`subject="This is a subject test"` + +Encoded, this query would look like this: + +`subject%3D%22This%20is%20a%20subject%20test%22` + +{% anchor h3 %} +Filter by recipient email +{% endanchor %} + +Use this query to filter by a recipient's email: (replace `<>` with an API key from your account, and replace <> with the URL encoded recipients email): + +{% codeblock %} +curl --request GET \ + --url 'https://api.sendgrid.com/v3/messages?limit=10&query=to_email%3D%22<>%22' \ + --header 'authorization: Bearer <>' +{% endcodeblock %} + +Recipient email queries have this format: + +`to_email="example@example.com"` + +Encoded, this query would look like this: + +`to_email%3D%22example%40example.com%22` + +{% anchor h3 %} +Filter by bounced emails +{% endanchor %} + +Use this query to filter by all bounced emails: (replace `<>` with an API key from your account): + +{% codeblock %} +curl --request GET \ + --url 'https://api.sendgrid.com/v3/messages?limit=10&query=status%3D%22bouced%22' \ + --header 'authorization: Bearer <>' +{% endcodeblock %} + +Subject queries have this format: + +`status="bounced"` + +Encoded, this query would look like this: + +`status%3D%22bouced%22` + +{% anchor h2 %} +Creating compound queries +{% endanchor %} + +Use [operators and keywords](#-Keywords-and-Operator-reference) to combine queries for a compound query. For example, you could filter for emails between a date range, or you could filter for when a specific recipients email is bounced. Here are some common use cases: + +{% anchor h3 %} +Filter by a recipient email that was bounced +{% endanchor %} + +Use this query to filter by a recipient's email and by emails that are bounced: (replace `<>` with an API key from your account, and replace <> with the URL encoded recipients email): + +{% codeblock %} +curl --request GET \ + --url 'https://api.sendgrid.com/v3/messages?limit=10&query=status%3D%22bounced%22%20AND%20to_email%3D%22<>%22' \ + --header 'authorization: Bearer <>' +{% endcodeblock %} + +{% anchor h3 %} +Filter by date range +{% endanchor %} + +Use this query to filter to emails between specific dates: (replace `<>` with an API key from your account, and replace {start_date} and {end_date} with a URL encoded UTC date string in this format: `YYYY-MM-DD HH:mm:SS`. Encoded, this looks like this: `2018-02-01T00%3A00%3A00.000Z`) + +{% codeblock %} +curl --request GET \ + --url 'https://api.sendgrid.com/v3/messages?limit=10&query=last_event_time%20BETWEEN%20TIMESTAMP%20%{start_date}%22%20AND%20TIMESTAMP%20%22{end_date}%22' \ + --header 'authorization: Bearer <>' +{% endcodeblock %} + +{% anchor h3 %} +Filter by a recipient and a date range +{% endanchor %} + +Use this query to filter to emails by recipient and between specific dates: (replace `<>` with an API key from your account, replace <> and <> with a URL encoded UTC date string in this format: `YYYY-MM-DD HH:mm:SS`, and and replace <> with the URL encoded recipient's email) + +{% codeblock %} +curl --request GET \ + --url 'https://api.sendgrid.com/v3/messages?limit=10&query=last_event_time%20BETWEEN%20TIMESTAMP%20%{start_date}%22%20AND%20TIMESTAMP%20%22{end_date}%22AND%20to_email%3D%22<>%22' \ + --header 'authorization: Bearer <>' +{% endcodeblock %} + +{% anchor h2 %} +Keywords and Operator reference +{% endanchor %} + +There are several operators and keywords that you can use to build [Compound queries](#-Creating-compound-queries). Use these operators between query statements. If the character used as the delimiter if it is found within the string. The escape character is `\`, which must be escaped with a preceding `\`. All queries need to be URL encoded. + +*This is a full list of accepted operators and keywords:* + +- `=` +- `!=` +- `<` +- `>` +- `<=` +- `>=` +- `-` - to +- `+` +- `/` +- `*` +- `-` - subtraction +- AND +- BETWEEN +- NOT BETWEEN +- DAY +- FALSE +- HOUR +- IN +- NOT IN +- INTERVAL +- IS +- IS NOT +- LIKE +- NOT LIKE +- MINUTE +- MONTH +- NOT +- NULL +- OR +- SECOND +- TIMESTAMP +- TRUE +- YEAR + + +{% anchor h2 %} +Query reference +{% endanchor %} + +This is a full list of basic query types and examples: (replace the data in quotes with the information you want to query, and then URL encode it) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    QueryUnencoded example
    msg_idmsg_id="filter0307p1las1-16816-5A023E36-1.0"
    from_emailfrom_email="testing@sendgrid.net"
    subjectsubject="This is a subject test"
    to_emailto_email="example@example.com"
    statusstatus="processed"
    template_idtemplate_id="8f0d27bc-cf8f-42d3-b951-3990af7d0619"
    template_nametemplate_name="example_template"
    campaign_namecampaign_name="example_campaign"
    campaign_idcampaign_id="1453849"
    api_key_idapi_key_id="SG.xxxxxxxxxxxxxxxx" (everything before the middle dot in the API key)
    api_key_nameapi_key_name="test_name"
    eventsstatus="processed"
    originating_ip - this is the IP address of the person sending the messageoriginating_ip="4.77.777.77"
    categories - custom tags that you createcategories="category_example"
    unique_args - custom tracking arguments that you can attach to SMTP API callsunique_args="example argument"
    outbound_ip - this is the SendGrid dedicated IP address used to send the emailoutbound_ip="4.77.777.77"
    last_event_timelast_event_time="2017-11-07T23:13:58Z"
    clicksclicks="0"
    unsubscribe_group_nameunsubscribe_group_name="Global Unsubscribes"
    unsubscribe_group_idunsubscribe_group_id="1041"
    teammate - teamates usernameteammate="my_username"
    + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Email Activity Feed API Reference](https://sendgrid.api-docs.io/v3.0/email-activity/filter-all-messages) +- [Legacy Email Activity Feed UI](https://sendgrid.com/docs/User_Guide/email_activity.html) +- [Email Activity Feed UI](https://sendgrid.com/docs/User_Guide/email_activity_feed.html) diff --git a/source/API_Reference/Web_API_v3/Whitelabel/domains.apiblueprint b/source/API_Reference/Web_API_v3/Whitelabel/domains.apiblueprint index f3b430aaf8..d7354f8b20 100644 --- a/source/API_Reference/Web_API_v3/Whitelabel/domains.apiblueprint +++ b/source/API_Reference/Web_API_v3/Whitelabel/domains.apiblueprint @@ -15,8 +15,8 @@ FORMAT: 1A # Group Domain Whitelabels A domain whitelabel consists of a subdomain and domain that will be used to set the appropriate DKIM, SPF, and Return-Path. -There is an option to allow SendGrid to manage security or the customers may manage their own DNS records. For customers using the manual -security option, they will need to create the appropriate MX, DKIM, and SPF records with their hosting provider. With automatic security, +There is an option to allow SendGrid to manage security or the customers may manage their own DNS records. For customers using the manual +security option, they will need to create the appropriate MX, DKIM, and SPF records with their hosting provider. With automatic security, the customer will just need to create a few CNAMEs to SendGrid, and SendGrid will manage the MX, DKIM and SPF records. @@ -117,10 +117,10 @@ the customer will just need to create a few CNAMEs to SendGrid, and SendGrid wil + Attributes (object) + domain example.com (required, string) - Domain being whitelabeled. - + subdomain news (required, string) - Subdomain being whitelabeled. + + subdomain news (optional, string) - Subdomain being whitelabeled. If you do not provide one, our system will generate one and provide it in the Response Body. + automatic_security false (optional, boolean) - Whether to allow SendGrid to manage your SPF records, DKIM keys, and DKIM key rotation. + ips ["192.168.1.1"] (optional, array[string]) - Specify IPs to be used in your SPF record. - + custom_spf true (optional, boolean) - Specify whether to use a custom spf or allow SendGrid to manage your SPF. This option is only available to domain whitelabels setup for manual security. + + custom_spf true (optional, boolean) - Specify whether to use a custom spf or allow SendGrid to manage your SPF. This option is only available to domain whitelabels setup for manual security. + default false (optional, boolean) - Whether to use this whitelabel as the fallback if no domain whitelabels match the sender's domain. {% info %} @@ -235,8 +235,8 @@ You may create up to a maximum of 1500 domain whitelabels. ### Update a Domain [PATCH] + Attributes - + default false (optional, boolean) - Inidcates whether this domain whitelabel should be considered the default. Defaults to false. - + custom_spf false (optional, boolean) - Indicates whether to generate a custom SPF record for manual security. Defaults to false. + + default false (optional, boolean) - Indicates whether this domain whitelabel should be considered the default. Defaults to false. + + custom_spf false (optional, boolean) - Indicates whether to generate a custom SPF record for manual security. Defaults to false. + Request (application/json) @@ -469,7 +469,7 @@ You may create up to a maximum of 1500 domain whitelabels. { "id": 1, "valid": true, - "validation_resuts": { + "validation_results": { "mail_cname": { "valid": false, "reason": "Expected your MX record to be \"mx.sendgrid.net\" but found \"example.com\"." @@ -498,9 +498,9 @@ You may create up to a maximum of 1500 domain whitelabels. ## Associated Domain [/whitelabel/domains/subuser?username={username}] -Domain Whitelabels can be associated with subusers via parent accounts. This functionality allows -subusers to send mail off their parent's Whitelabels. To associate a Whitelabel, the parent account -must first create a Whitelabel and validate it. Then the parent may associate the Whitelabel in +Domain Whitelabels can be associated with subusers via parent accounts. This functionality allows +subusers to send mail off their parent's Whitelabels. To associate a Whitelabel, the parent account +must first create a Whitelabel and validate it. Then the parent may associate the Whitelabel in subuser management. @@ -567,14 +567,14 @@ subuser management. ### Associate Domain [POST] + Attributes - + username jane@example.com (required, string) - Username to associate with the domain whitelabel. + + username janeexampexample@example.com (required, string) - Username to associate with the domain whitelabel. + Request + Body { - "username": "jane@example.com" + "username": "janeexampexample@example.com" } + Response 201 (application/json) diff --git a/source/API_Reference/Web_API_v3/Whitelabel/ips.apiblueprint b/source/API_Reference/Web_API_v3/Whitelabel/ips.apiblueprint index 97f0e42e66..a0c6f5a1aa 100644 --- a/source/API_Reference/Web_API_v3/Whitelabel/ips.apiblueprint +++ b/source/API_Reference/Web_API_v3/Whitelabel/ips.apiblueprint @@ -14,7 +14,7 @@ FORMAT: 1A # Group IP Whitelabel -A IP whitelabel consists of a subdomain and domain that will be used to generate a reverse DNS record for a given IP. Once SendGrid +A IP whitelabel consists of a subdomain and domain that will be used to generate a reverse DNS record for a given IP. Once SendGrid has verified that the customer has created the appropriate A record for their IP, SendGrid will create the appropriate reverse DNS record for the IP. @@ -38,7 +38,7 @@ Return list of IPs. If search key is provided, returns IPs that matches. "users": [ {"username":"john@example.com", "user_id":7}, - {"username": "jane@example.com", "user_id":8} + {"username": "janeexampexample@example.com", "user_id":8} ], "subdomain": "email", "domain": "example.com", diff --git a/source/API_Reference/Web_API_v3/Whitelabel/links.apiblueprint b/source/API_Reference/Web_API_v3/Whitelabel/links.apiblueprint index 076315e9cd..85b00f1df1 100644 --- a/source/API_Reference/Web_API_v3/Whitelabel/links.apiblueprint +++ b/source/API_Reference/Web_API_v3/Whitelabel/links.apiblueprint @@ -5,7 +5,7 @@ title: Links seo: title: Whitelabel Links description: Whitelabel click tracking links and open tracking image with SendGrid over the v3 API - keywords: link whitelabel, whitelabel link, whitelabel click tracking links, whitelabe open tracking image + keywords: link whitelabel, whitelabel link, whitelabel click tracking links, whitelabel open tracking image navigation: show: true --- @@ -14,7 +14,7 @@ FORMAT: 1A # Group Link Whitelabel -A link whitelabel consists of a subdomain and domain that will be used to rewrite links in mail messages. Our customer will be asked +A link whitelabel consists of a subdomain and domain that will be used to rewrite links in mail messages. Our customer will be asked to create a couple CNAME records for the links to be rewritten to and for us to verify that they are the domain owners. ## Links Collection [/whitelabel/links] @@ -127,7 +127,7 @@ You may create up to a maximum of 1500 link whitelabels. ### Retrieve a Link [GET] -+ Response 200 (applicaiton/json) ++ Response 200 (application/json) + Body { @@ -195,7 +195,7 @@ You may create up to a maximum of 1500 link whitelabels. + Response 204 ## Default Link [/whitelabel/links/default?domain={domain}] -Default link is the actual link whitelabel to be used when sending messages. If there are multiple link whitelabels, the default is determined by the following order: +Default link is the actual link whitelabel to be used when sending messages. If there are multiple link whitelabels, the default is determined by the following order:
    • Validated link whitelabels marked as "default"
    • @@ -268,9 +268,9 @@ Default link is the actual link whitelabel to be used when sending messages. If ## Associated Link [/whitelabel/links/subuser?username={username}] -Link Whitelabels can be associated with subusers via parent accounts. This functionality allows -subusers to send mail off their parent's Whitelabels. To associate a Whitelabel, the parent account -must first create a Whitelabel and validate it. Then the parent may associate the Whitelabel in +Link Whitelabels can be associated with subusers via parent accounts. This functionality allows +subusers to send mail off their parent's Whitelabels. To associate a Whitelabel, the parent account +must first create a Whitelabel and validate it. Then the parent may associate the Whitelabel in subuser management. + Parameters @@ -319,13 +319,13 @@ subuser management. ### Associate Link [POST] + Attributes - + username jane@example.com (required, string) - User to associate with the link whitelabel. + + username janeexampexample@example.com (required, string) - User to associate with the link whitelabel. + Request + Body { - "username": "jane@example.com" + "username": "janeexampexample@example.com" } + Response 201 (application/json) diff --git a/source/API_Reference/Web_API_v3/blocks.apiblueprint b/source/API_Reference/Web_API_v3/blocks.apiblueprint index 706d5b0622..a8c8cdfcfb 100644 --- a/source/API_Reference/Web_API_v3/blocks.apiblueprint +++ b/source/API_Reference/Web_API_v3/blocks.apiblueprint @@ -33,7 +33,7 @@ There are several causes for blocked emails: for example, your mail server IP ad }, { "created": 1443651154, - "email": "user2@example.com", + "email": "exampexample@example.comom", "reason": "error dialing remote address: dial tcp 10.57.152.165:25: no route to host", "status":"4.0.0" } diff --git a/source/API_Reference/Web_API_v3/cancel_schedule_send.apiblueprint b/source/API_Reference/Web_API_v3/cancel_schedule_send.apiblueprint index 17889f660c..99218a2157 100644 --- a/source/API_Reference/Web_API_v3/cancel_schedule_send.apiblueprint +++ b/source/API_Reference/Web_API_v3/cancel_schedule_send.apiblueprint @@ -99,6 +99,10 @@ Cancel or pause a scheduled send. "batch_id" : "invalid batch id" "batch_id" : "a status for this batch id exists, try PATCH to update the status" +{% warning %} +Scheduled sends cancelled less than 10 minutes before the scheduled time are not guaranteed to be cancelled. +{% endwarning %} + ### Retrieve all Cancelled and Paused scheduled sends [GET] Get all cancel/paused scheduled send information. @@ -152,9 +156,9 @@ Update the status of a scheduled send. "" : "batch id not found" -### Delete a cancellation or pause of a scheduled send [DELETE] +### Delete a cancellation or pause state of a scheduled send [DELETE] -Delete the cancellation/pause of a scheduled send. Any messages still in the sending queue with this Batch ID will revert to an active state, and delivery will be attempted when their `send_at` value is reached. Any "past due" messages (such as those that were *paused*) will be attempted to be delivered immediately. +Delete the cancellation/pause state of a scheduled send. Any messages still in the sending queue with this Batch ID will revert to an active state, and delivery will be attempted when their `send_at` value is reached. Any paused messages past their scheduled send time will be attempted to be delivered immediately. Any cancelled messages past their scheduled sent time will be dropped. + Request (application/json) diff --git a/source/API_Reference/Web_API_v3/index.md b/source/API_Reference/Web_API_v3/index.md index ed5ec20e7d..97109df08a 100644 --- a/source/API_Reference/Web_API_v3/index.md +++ b/source/API_Reference/Web_API_v3/index.md @@ -17,7 +17,7 @@ curl --request POST \ --url https://api.sendgrid.com/v3/mail/send \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ - --data '{"personalizations": [{"to": [{"email": "your.email@example.com"}]}],"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}' + --data '{"personalizations": [{"to": [{"email": "example@example.com"}]}],"from": {"email": "example@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}' {% endcodeblock %} {% info %} diff --git a/source/API_Reference/Web_API_v3/spam_reports.apiblueprint b/source/API_Reference/Web_API_v3/spam_reports.apiblueprint index 97792dd470..20a7c390aa 100644 --- a/source/API_Reference/Web_API_v3/spam_reports.apiblueprint +++ b/source/API_Reference/Web_API_v3/spam_reports.apiblueprint @@ -33,7 +33,7 @@ FORMAT: 1A }, { "created": 1443651154, - "email": "user2@example.com", + "email": "exampexample@example.comom", "ip": "10.63.202.100" } ] diff --git a/source/API_Reference/Web_API_v3/teammates.md b/source/API_Reference/Web_API_v3/teammates.md index 0e65e2d6de..1da0e6963f 100644 --- a/source/API_Reference/Web_API_v3/teammates.md +++ b/source/API_Reference/Web_API_v3/teammates.md @@ -161,7 +161,7 @@ HTTP/1.1 200 "expiration_date": 1456424263 }, { - "email": "user2@example.com", + "email": "exampexample@example.comom", "scopes": [], "is_admin": true, "pending_id": "bcde234bcd", @@ -288,7 +288,7 @@ HTTP/1.1 200 }, { "username": "teammate3", - "email": "teammate3@example.com", + "email": "example@example.com", "first_name": "Steve", "last_name": "Doe", "user_type": "admin", diff --git a/source/API_Reference/Web_API_v3/user.apiblueprint b/source/API_Reference/Web_API_v3/user.apiblueprint index c359f7da7b..9dc5ab8879 100644 --- a/source/API_Reference/Web_API_v3/user.apiblueprint +++ b/source/API_Reference/Web_API_v3/user.apiblueprint @@ -10,6 +10,10 @@ navigation: --- FORMAT: 1A +{%info%} +These API calls require Authorization with an API Key that [has User scopes](https://sendgrid.com/docs/API_Reference/Web_API_v3/API_Keys/api_key_permissions_list.html#User-Settings), or `Basic` Authorization with the Base64-encoded `username:password` of the account. +{%endinfo%} + ## User Profile [/user/profile] ### GET User Profile [GET] diff --git a/source/API_Reference/Webhooks/debug.md b/source/API_Reference/Webhooks/debug.md deleted file mode 100644 index b3797493ab..0000000000 --- a/source/API_Reference/Webhooks/debug.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -layout: page -weight: 10 -title: Debugging Webhooks -navigation: - show: true ---- - -If you need to see what kind of responses you're going to get from our webhooks, or you need to tunnel directly to your developer environment, there is a selection of tools out there to help you. Here we'll look at a few different options and how to set them up. - -{% anchor h2 %} -RequestBin -{% endanchor %} - -[RequestBin](http://requestb.in) works by providing a unique URL that you can set as your endpoint for both the Inbound Parse and the Event Notifications Webhooks. You can then check this URL to see what responses you're getting back from us. - -{% anchor h3 %} -Setup -{% endanchor %} - -You may generate a unique URL by creating a "RequestBin" - -The URL looks like this: - -{% codeblock lang:html %} -http://requestb.in/19e3ycm1 -{% endcodeblock %} - - -{% anchor h3 %} -Receive Event Notifications Data -{% endanchor %} - -To have all your event notifications posted to this URL first turn on the [Event Notification app]({{root_url}}/User_Guide/Apps/event_notification.html) in your dashboard. - -Next, select which notifications you would like to have sent to RequestBin (if in doubt, tick all the checkboxes to turn them all on) and enter the unique URL generated by RequestBin as your Post Event URL at the bottom of the page. Once you've saved the changes, all event notifications will be sent to RequestBin for you to check. - -{% anchor h3 %} -Receive Inbound Parse Data -{% endanchor %} - -Before you can receive data through the Inbound Parse Webhook, you will need to follow the [instructions for making changes to your MX records]({{root_url}}/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html#-Setting-up-an-MX-Record) in your DNS setup. - -Once that has been completed you can [setup your Inbound Parse]({{site.site_url}}/developer/reply) by adding a hostname and a URL where the payloads can POST. In this case, you need to add your RequestBin URL as the URL to POST to. - -{% anchor h3 %} -Seeing the results -{% endanchor %} - -After completing the setup for your chosen webhook, the results can be found by heading to your RequestBin unique URL in a browser. - -{% anchor h2 %} -ngrok -{% endanchor %} - -[ngrok](https://ngrok.com/) is a tool for creating a local tunnel to your machine, it makes testing webhooks locally extremely easy. - -Start by [signing up](https://ngrok.com/dashboard) so you can use all the features available. In particular, the ability to use custom subdomains will remove the need to amend your webhook settings each time you run ngrok. - -{% anchor h3 %} -Setup -{% endanchor %} - -To get up and running, install and enter the following in your CLI - -{% codeblock lang:html %} -$ ngrok 3000 -{% endcodeblock %} - -This would open up a connection to port 3000 on your local machine, at a URL like `http://3a4bfceb.ngrok.com`. You may then put this URL as your the URL for your Parse Webhook or Event Webhook. - -Rather than having to change this every time you restart ngrok, specify the subdomain flag: - -{% codeblock lang:html %} -$ ngrok -subdomain=myappname 3000 -{% endcodeblock %} - -This will open up port 3000 and make it accessible at `http://myappname.ngrok.com`. - -{% anchor h3 %} -Seeing what's happening -{% endanchor %} - -Additionally, ngrok runs a web interface at ``http://localhost:4040
      , that allows you to monitor requests in and out, as well as giving you the ability to replay previous requests at the click of a button. -{% anchor h3 %} -More information -{% endanchor %} - -For more information on what you can do with ngrok, [check out their documentation](https://ngrok.com/usage). - -{% anchor h2 %} -Runscope -{% endanchor %} - -[Runscope](https://runscope.com) is a tool for debugging APIs. It acts as a proxy, collecting all data sent to it and passes it on to another point. You may then, later, review what was sent to the API you're debugging. - -This can be extrordinarily helpful when debugging webhooks, and [Runscope has a tutorial on how to do this](https://www.runscope.com/provider-guide/troubleshooting-webhooks). diff --git a/source/API_Reference/Webhooks/event.md b/source/API_Reference/Webhooks/event.md deleted file mode 100644 index 4d8da2e3d4..0000000000 --- a/source/API_Reference/Webhooks/event.md +++ /dev/null @@ -1,1100 +0,0 @@ ---- -layout: page -weight: 10 -title: Event Webhook -navigation: - show: true ---- - -{% info %} -Available to all accounts except [Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html). -{% endinfo %} - -SendGrid's Event Webhook will notify a URL of your choice via HTTP POST with information about events that occur as SendGrid processes your email. Common uses of this data are to remove unsubscribes, react to spam reports, [determine unengaged recipients]({{site.blog_url}}/infer-engagement-with-the-event-api/), identify bounced email addresses, or create advanced analytics of your email program. With Unique Arguments and Category parameters, you can insert dynamic data that will help build a sharp, clear image of your mailings. - -{% info %} -If you'd like to see how one of our customers uses the Event Webhook, check out [Leveraging SendGrid's Event Webhook]({{site.blog_url}}/leveraging-sendgrids-event-api/). -{% endinfo %} - -{% info %} -There are a number of pre-made integrations for the SendGrid Event Webhook that make processing events easy. You can find them in the [Library Index]({{root_url}}/Integrate/libraries.html#-Webhook-Libraries). -{% endinfo %} - -{% anchor h2 %} -Setup -{% endanchor %} - -To setup the Event Webhook via our web interface, login and go to the [mail settings page]({{site.app_url}}/settings/mail_settings) and click on the Event Notification setting, then click on the "edit" link. Check the boxes next to the type of events that you want posted to your web server, then enter in the URL you have setup to receive POSTs from our servers when an event occurs. - -The Event Webhook may also be setup by using our [Filter Settings Endpoint]({{root_url}}/API_Reference/Web_API/filter_settings.html#-Event-Notification). - -{% info %} -We support basic HTTP authentication in our Event Webhook. Those who wish to implement can provide credentials in the post event url field on the app settings page. Below is an example of the post url with authentication included. -{% endinfo %} - -{% codeblock lang:html %} -http(s)://username:password@domain/foo.php -{% endcodeblock %} - - -{% warning %} -The Event Webhook will not follow redirects. Please make sure to use the correct URL, or posting will fail. -{% endwarning %} - -{% warning %} -If you wish to receive encrypted posts, we require that your callback URL support TLS 1.2. -{% endwarning %} - -{% anchor h2 %} -Requests -{% endanchor %} - -You will receive an **HTTP POST** containing a JSON array of multiple events in one request after a very short delay. These POSTs will be sent to the URL you have defined in the Event Notification app options. - -{% info %} -Events currently post every 30 second or when the batch size reaches 768K (seven hundred sixty-eight kilobytes), whichever occurs first. This is per server, so the webhook URL will normally receive tens, and may receive hundreds, of posts per second. -{% endinfo %} - -{% anchor h3 %} -Event POST Example -{% endanchor %} - -{% codeblock lang:json %} -[ - { - "sg_message_id":"sendgrid_internal_message_id", - "email": "john.doe@sendgrid.com", - "timestamp": 1337197600, - "smtp-id": "<4FB4041F.6080505@sendgrid.com>", - "event": "processed" - }, - { - "sg_message_id":"sendgrid_internal_message_id", - "email": "john.doe@sendgrid.com", - "timestamp": 1337966815, - "category": "newuser", - "event": "click", - "url": "https://sendgrid.com" - }, - { - "sg_message_id":"sendgrid_internal_message_id", - "email": "john.doe@sendgrid.com", - "timestamp": 1337969592, - "smtp-id": "<20120525181309.C1A9B40405B3@Example-Mac.local>", - "event": "group_unsubscribe", - "asm_group_id": 42 - } -] -{% endcodeblock %} - -You can test your endpoint by clicking the "Test Your Integration" button on the setup screen. SendGrid will send a simulated POST of events to your callback url. At this time, our testing tool does not support HTTP basic authentication, so you must disable auth on your app while debugging. - -SendGrid expects a 2xx HTTP response to the POST, otherwise the event notification will be retried. If your URL returns a non-2xx HTTP code it will be deferred and retried for 24 hours. The maximum number of deferred POSTs in the retry queue is 100,000. If the queue is full, the oldest request in the queue will be removed to make room for the newest deferred POST. Events that cannot be submitted within the maximum retry period or events removed from the defer queue will be lost. - -{% warning %} -If your email traffic generates a lot of events, the incoming data can easily overload a web server if not configured properly. You can load test your endpoints with [loader.io](http://loader.io) for free. -{% endwarning %} - -{% anchor h3 %} -Duplicate Events -{% endanchor %} - -**It is possible to see duplicate events in the data posted by the Event Webhook.** - -We recommend that you use some form of deduplication when processing or storing your Event Webhook data using the `sg_event_id` as a differentiator, since this ID is unique for every event. - -{% anchor h2 %} -Event Types -{% endanchor %} - -The following lists the events generated by SendGrid: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      EventCriteria
      ProcessedMessage has been received and is ready to be delivered.
      DroppedYou may see the following drop reasons: Invalid SMTPAPI header, Spam Content (if spam checker app enabled), Unsubscribed Address, Bounced Address, Spam Reporting Address, Invalid, Recipient List over Package Quota
      DeliveredMessage has been successfully delivered to the receiving server.
      DeferredRecipient's email server temporarily rejected message.
      BounceReceiving server could not or would not accept message.
      OpenRecipient has opened the HTML message. You need to enable Open Tracking for getting this type of event.
      ClickRecipient clicked on a link within the message. You need to enable Click Tracking for getting this type of event.
      Spam ReportRecipient marked message as spam.
      UnsubscribeRecipient clicked on the 'Opt Out of All Emails' link (available after clicking the message's subscription management link). You need to enable Subscription Tracking for getting this type of event.
      Group UnsubscribeRecipient unsubscribed from specific group, by either direct link or updating preferences. You need to enable Subscription Tracking for getting this type of event.
      Group ResubscribeRecipient resubscribes to specific group by updating preferences. You need to enable Subscription Tracking for getting this type of event.
      - -The following image shows where events can be generated as email is being processed: - -![]({{root_url}}/images/event_1.jpg "Event Flow") - -{% anchor h2 %} -Default Parameters for Delivery Events -{% endanchor %} - -The following parameters are sent with delivery events: bounce, deferred, delivered, dropped, and processed events. Some events may include additional parameters. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ParameterDescription
      eventOne of: bounce, deferred, delivered, dropped, processed
      emailEmail address of the intended recipient
      timestampUNIX timestamp
      smtp-idAn id attached to the message by the originating system
      ipWhich IP address was used to send the email.
      tlsWhether or not TLS was used when sending the email.
      cert_errWhether there was a certificate error on the receiving side.
      - -{% anchor h2 %} -Default Parameters for Engagement Events -{% endanchor %} - -The following parameters are sent with engagement events: click, open, spamreport, and unsubscribe events. Some events may include additional parameters. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ParameterDescription
      eventOne of: click, open, spamreport, unsubscribe
      emailEmail address of the intended recipient
      timestampUNIX timestamp
      useragentThe user agent responsible for the event, e.g. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
      ipWhich IP address was used to send the email.
      tlsWhether or not TLS was used when sending the email.
      cert_errWhether there was a certificate error on the receiving side.
      - -{% anchor h2 %} -Unique Arguments and Custom Arguments -{% endanchor %} - -Events generated by SendGrid may also include any [unique arguments]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html) or custom arguments. - -{% info %} -Unique arguments and custom arguments are functionally the same: unique arguments are used when sending email via the SMTP API or v2 Mail Send while custom arguments are used when sending email via v3 Mail Send. -{% endinfo %} - -{% anchor h3 %} -Unique Arguments -{% endanchor %} - -To define and receive unique arguments when sending email via the [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html) or the [v2 Mail Send endpoint]({{root_url}}/API_Reference/Web_API/mail.html) simply use the `unique_args` parameter in the X-SMTPAPI header or parameter. For example, if you have an application and want to receive custom parameters such as the `userid` and the email `template`, you would submit them in the X-SMTPAPI header or parameter, as described [here]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html). - -For example, if you include the following unique arguments in your x-smtpapi parameter for an email sent via the v2 Mail Send endpoint: - -{% codeblock lang:json %} -{ - "unique_args": { - "userid": "1123", - "template": "welcome" - } -} -{% endcodeblock %} - -You will receive the same unique argument included with the data returned to the Event Webhook: - -{% codeblock lang:json %} -[ - { - "sg_message_id":"sendgrid_internal_message_id", - "email": "john.doe@sendgrid.com", - "timestamp": 1337966815, - "event": "click", - "url": "https://sendgrid.com", - "userid": "1123", - "template": "welcome" - } -] -{% endcodeblock %} - -{% warning %} -You can create unique arguments with the same keys as reserved words, such as "event" or "email". In this case, SendGrid will default to the reserved key and NOT your unique argument. An example of this is below. -{% endwarning %} - -{% anchor h4 %} -Reserved Keys in Unique Arguments -{% endanchor %} - -{% codeblock lang:json %} -//for this example, assume we're sending to john.doe@sendgrid.com -{ - "unique_args": { - "customerAccountNumber": "55555", - "activationAttempt": "1", - "New Argument 1": "New Value 1", - "email": "jane.doe@sendgrid.com", - "event": "SendEmail" - } -} -{% endcodeblock %} - -{% anchor h4 %} -The resulting webhook call -{% endanchor %} - -{% codeblock lang:json %} -[ - { - "event": "Processed", - "timestamp":"123456789", - "customerAccountNumber": "55555", - "activationAttempt": "1", - "New Argument 1": "New Value 1", - "email": "john.doe@sendgrid.com" - } -] -{% endcodeblock %} - -*Note: The event and the email are not overwritten, because "event" and "email" are reserved and SendGrid defaults to the reserved key for webhooks.* - -{% anchor h3 %} -Custom Arguments -{% endanchor %} - -Any custom arguments that you include with an email sent through [v3 Mail Send]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html) will also be included in your Event Webhook response. - -For example, if you were to include the following custom arguments in a personalization in your payload to the v3 Mail Send endpoint: - -{% codeblock lang:json %} -{ - "personalizations": [ - { - "to": [ - { - "email": "example@example.com" - } - ], - "subject": "Hello, World!", - "custom_args": { - "userid": "1123" - } - } - ], - "from": { - "email": "from_address@example.com" - }, - "content": [ - { - "type": "text/plain", - "value": "Hello, World!" - } - ] -} -{% endcodeblock %} - -The following would be included with the data returned to the Event Webhook: - -{% codeblock lang:json %} -[ - { - "userid": "1123" - } -] -{% endcodeblock %} - -{% anchor h2 %} -Unsubscribe Groups -{% endanchor %} - -If [Unsubscribe Groups]({{root_url}}/User_Guide/Suppressions/advanced_suppression_manager.html) are used over the SMTP API they will be returned by the Event Webhook as such: - -{% codeblock lang:json %} - { - "status":"5.0.0", - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "event":"bounce", - "email":"email@example.com", - "timestamp":1249948800, - "smtp-id":"", - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "reason":"500 No Such User", - "type":"bounce", - "asm_group_id": 1 - } -{% endcodeblock %} - -{% anchor h2 %} -Categories -{% endanchor %} - -{% info %} -For categories, we return what was sent. If you send single categories as an array, they will be returned by the webhook as an array. If you send single categories as a string, they will be returned by the webhook as a string. -{% endinfo %} - -If [categories]({{root_url}}/User_Guide/Delivery_Metrics/categories.html) are used over the SMTP API they will be returned by the Event Webhook as such: - -{% anchor h3 %} -Category as a String -{% endanchor %} - -Single categories sent as a string will be returned as a string. - -{% codeblock lang:json %} -[ - { - "email": "john.doe@sendgrid.com", - "timestamp": 1337966815, - "category": "newuser", - "event": "open" - }, - { - "email": "jane.doe@sendgrid.com", - "timestamp": 1337966815, - "category": "olduser", - "event": "open" - } -] -{% endcodeblock %} - -{% anchor h3 %} -Categories Array -{% endanchor %} - -Categories sent to SendGrid as an array will be returned as an array. - -{% codeblock lang:json %} -[ - { - "email": "john.doe@sendgrid.com", - "timestamp": 1337966815, - "category": [ - "newuser", - "transactional" - ], - "event": "open" - }, - { - "email": "jane.doe@sendgrid.com", - "timestamp": 1337966815, - "category": "olduser", - "event": "open" - } -] -{% endcodeblock %} - -{% anchor h2 %} -Example -{% endanchor %} -The following example uses PHP to store webhook requests in `/tmp/log.txt`: - -{% codeblock lang:php %} - $value) { - fwrite($fh, print_r("$header: $value \n", true)); -} - -fwrite($fh, print_r("$postdata \n", true)); -fclose($fh); -} - -echo "ok"; -?> -{% endcodeblock %} - -{% anchor h2 %} -IP Pools -{% endanchor %} - -For emails sent with a specified IP Pool, you can view the IP Pool used in the event post for a processed event. - -{% codeblock lang:json %} -[ - { - "email": "john.doe@sendgrid.com", - "smtp-id": "<14c583da911.2c36.1c804d@ismtpd-073>", - "timestamp": 1427409578, - "pool": { - "name": "new_MY_test", - "id": 210 - }, - "sg_event_id": "RHFZB1IrTD2Y9Q7bUdZxUw", - "sg_message_id": "14c583da911.2c36.1c804d.filter-406.22375.55148AA99.0", - "event": "processed" - } -] -{% endcodeblock %} - -{% anchor h2 %} -Parameter Details -{% endanchor %} - -The following shows each type of event that can be posted along with all the possible parameters that go along with the event. - -{% info %} -You can use the SMTP API to specify additional custom parameters including categories and unique args. Each unique arg is posted as a separate post parameter, similar to the category listed below, but with a custom name specified by you. -{% endinfo %} - -{% info %} -The examples provided below are a JSON array for a particular event. These will always be within an array on the actual POST. The fields are not ordered. -{% endinfo %} - -{% anchor h3 %} -Bounce -{% endanchor %} - - - - - - - - - - - - - - - - - - - - - - -
      eventemailstatusreasontypecategory
      bounceMessage recipientStatus code string, e.g. 5.5.0Bounce reason from MTABounce/Blocked/ExpiredThe category you assigned
      - -{% codeblock lang:json %} -{ - "status":"5.0.0", - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "event":"bounce", - "email":"email@example.com", - "timestamp":1249948800, - "smtp-id":"", - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "newsletter": { - "newsletter_user_list_id": "10557865", - "newsletter_id": "1943530", - "newsletter_send_id": "2308608" - }, - "asm_group_id": 1, - "reason":"500 No Such User", - "type":"bounce", - "ip" : "127.0.0.1", - "tls" : "1", - "cert_err" : "0" -} -{% endcodeblock %} - -{% anchor h3 %} -Click -{% endanchor %} - - - - - - - - - - - - - - - - - - -
      eventemailurlcategory
      clickMessage recipientURL ClickedThe category you assigned
      - -{% info %} -`url_offset` gives you more information about the link that was clicked. Links are indexed beginning at 0. `index` indicates which link was clicked based on that index. The type of link can be either text, HTML, or a header. `type` indicates the type of the link that was clicked. -{% endinfo %} - -{% codeblock lang:json %} -{ - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "ip":"255.255.255.255", - "useragent":"Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53", - "event":"click", - "email":"email@example.com", - "timestamp":1249948800, - "url":"http://yourdomain.com/blog/news.html", - "url_offset": { - "index": 0, - "type": "html" - }, - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "newsletter": { - "newsletter_user_list_id": "10557865", - "newsletter_id": "1943530", - "newsletter_send_id": "2308608" - }, - "asm_group_id": 1 -} -{% endcodeblock %} - -{% anchor h3 %} -Deferred -{% endanchor %} - - - - - - - - - - - - - - - - - - - - -
      eventemailresponseattemptcategory
      deferredMessage recipientFull response from MTADelivery attempt #The category you assigned
      - -{% codeblock lang:json %} -{ - "response":"400 Try again", - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "event":"deferred", - "email":"email@example.com", - "timestamp":1249948800, - "smtp-id":"", - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "attempt":"10", - "newsletter": { - "newsletter_user_list_id": "10557865", - "newsletter_id": "1943530", - "newsletter_send_id": "2308608" - }, - "asm_group_id": 1, - "ip" : "127.0.0.1", - "tls" : "0", - "cert_err" : "0" -} -{% endcodeblock %} - -{% anchor h3 %} -Delivered -{% endanchor %} - - - - - - - - - - - - - - - - - - -
      eventemailresponsecategory
      deliveredMessage recipientFull response from MTAThe category you assigned
      - -{% codeblock lang:json %} -{ - "response":"250 OK", - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "event":"delivered", - "email":"email@example.com", - "timestamp":1249948800, - "smtp-id":"", - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "newsletter": { - "newsletter_user_list_id": "10557865", - "newsletter_id": "1943530", - "newsletter_send_id": "2308608" - }, - "asm_group_id": 1, - "ip" : "127.0.0.1", - "tls" : "1", - "cert_err" : "1" -} -{% endcodeblock %} - -{% anchor h3 %} -Dropped -{% endanchor %} - - - - - - - - - - - - - - - - - - -
      eventemailreasoncategory
      droppedMessage recipientDrop reasonThe category you assigned
      - -{% codeblock lang:json %} -{ - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "email":"email@example.com", - "timestamp":1249948800, - "smtp-id":"", - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "reason":"Bounced Address", - "event":"dropped" -} -{% endcodeblock %} - -{% anchor h3 %} -Open -{% endanchor %} - - - - - - - - - - - - - - - - -
      eventemailcategory
      openMessage recipientThe category you assigned
      - -{% codeblock lang:json %} -{ - "email":"email@example.com", - "timestamp":1249948800, - "ip":"255.255.255.255", - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "useragent":"Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)", - "event":"open", - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "newsletter": { - "newsletter_user_list_id": "10557865", - "newsletter_id": "1943530", - "newsletter_send_id": "2308608" - }, - "asm_group_id": 1 -} -{% endcodeblock %} - -{% anchor h3 %} -Processed -{% endanchor %} - - - - - - - - - - - - - - - - -
      eventemailcategory
      processedMessage recipientThe category you assigned
      - -{% codeblock lang:json %} -{ - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "email":"email@example.com", - "timestamp":1249948800, - "smtp-id":"", - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "event":"processed", - "newsletter": { - "newsletter_user_list_id": "10557865", - "newsletter_id": "1943530", - "newsletter_send_id": "2308608" - }, - "asm_group_id": 1, - "send_at":1249949000 -} -{% endcodeblock %} - -{% anchor h3 %} -Spam Report -{% endanchor %} - - - - - - - - - - - - - - - - -
      eventemailcategory
      spamreportMessage recipientThe category you assigned
      - -{% codeblock lang:json %} -{ - "sg_event_id":"sendgrid_internal_event_id", - "sg_message_id":"sendgrid_internal_message_id", - "email":"email@example.com", - "timestamp":1249948800, - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "event":"spamreport", - "asm_group_id": 1 -} -{% endcodeblock %} - -{% anchor h3 %} -Unsubscribe -{% endanchor %} - - - - - - - - - - - - - - - - -
      eventemailcategory
      unsubscribeMessage recipientThe category you assigned
      - -{% codeblock lang:json %} -{ - "sg_message_id":"sendgrid_internal_message_id", - "email":"email@example.com", - "timestamp":1249948800, - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "event":"unsubscribe", - "asm_group_id": 1 -} -{% endcodeblock %} - -{% anchor h3 %} -Group Unsubscribe -{% endanchor %} - - - - - - - - - - - - - - - - - - -
      eventemailasm_group_idcategory
      group_unsubscribeMessage recipientThe id of the unsubscribed asm groupThe category you assigned
      - -{% codeblock lang:json %} -{ - "sg_message_id":"sendgrid_internal_message_id", - "email":"email@example.com", - "timestamp":1249948800, - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "event":"group_unsubscribe", - "asm_group_id":1, - "useragent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36", - "ip":"255.255.255.255" -} -{% endcodeblock %} - -{% anchor h3 %} -Group Resubscribe -{% endanchor %} - - - - - - - - - - - - - - - - - - -
      eventemailasm_group_idcategory
      group_resubscribeMessage recipientThe id of the resubscribed asm groupThe category you assigned
      - -{% codeblock lang:json %} -{ - "sg_message_id":"sendgrid_internal_message_id", - "email":"email@example.com", - "timestamp":1249948800, - "unique_arg_key":"unique_arg_value", - "category":["category1", "category2"], - "event":"group_resubscribe", - "asm_group_id":1, - "useragent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36", - "ip":"255.255.255.255" -} -{% endcodeblock %} - -{% anchor h2 %} -Marketing Campaigns -{% endanchor %} - -For emails sent through our Marketing Campaigns feature, we will add Marketing Campaigns specific params to the Event Webhook. Both `marketing_campaign_name` and `marketing_campaign_id` will be displayed as unique arguments in the event data. - -{% anchor h3 %} -Example event from a standard (non-A/B test) campaign send: -{% endanchor %} - -{% codeblock lang:json %} -{ - "category": [], - "email": "email@example.com", - "event": "processed", - "marketing_campaign_id": 12345, - "marketing_campaign_name": "campaign name", - "post_type": "event", - "sg_event_id": "sendgrid_internal_event_id", - "sg_message_id": "sendgrid_internal_message_id", - "sg_user_id": 12345, - "smtp-id": "", - "timestamp": 1442349428 -} -{% endcodeblock %} - -{% anchor h3 %} -Example event from an A/B Test: -{% endanchor %} - - `marketing_campaign_version` will be displayed in the event data for emails sent as part of an A/B Test. The value for `marketing_campaign_version` will be returned as `A`, `B`, `C`, etc. - -{% codeblock lang:json %} -{ - "category": [], - "email": "tadpole_0010@stbase-018.sjc1.sendgrid.net", - "event": "processed", - "marketing_campaign_id": 23314, - "marketing_campaign_name": "unique args ab", - "marketing_campaign_version": "B", - "marketing_campaign_split_id": 13471, - "post_type": "event", - "sg_event_id": "qNOzbkTuTNCdxa1eXEpnXg", - "sg_message_id": "5lFl7Fr1Rjme_EyzNNB_5A.stfilter-015.5185.55F883172.0", - "sg_user_id": 939115, - "smtp-id": "<5lFl7Fr1Rjme_EyzNNB_5A@stismtpd-006.sjc1.sendgrid.net>", - "timestamp": 1442349848 -} -{% endcodeblock %} - -{% anchor h3 %} -Example event from the winning phase of an A/B Test: -{% endanchor %} - -{% codeblock lang:json %} -{ - "category": [], - "email": "tadpole_0001@stbase-018.sjc1.sendgrid.net", - "event": "delivered", - "marketing_campaign_id": 23314, - "marketing_campaign_name": "unique args ab", - "post_type": "event", - "response": "250 Ok ", - "sg_event_id": "X2M1IUfMRhuAhWM0CbmFqQ", - "sg_message_id": "fPJrJPIRTxC_obpgfTy74w.stfilter-015.5185.55F883564.0", - "sg_user_id": 12345, - "smtp-id": "", - "timestamp": 1442349911 -} -{% endcodeblock %} - -{% anchor h3 %} -Legacy Marketing Email Unsubscribes -{% endanchor %} - -For emails sent through our Legacy Marketing Email tool, unsubscribes will look like the following example: - -{% codeblock lang:json %} -[ - { - "email": "nick@sendgrid.com", - "timestamp": 1380822437, - "newsletter": { - "newsletter_user_list_id": "10557865", - "newsletter_id": "1943530", - "newsletter_send_id": "2308608" - }, - "category": [ - "Tests", - "Newsletter" - ], - "event": "unsubscribe" - } -] -{% endcodeblock %} - -{% anchor h2 %} -Troubleshooting -{% endanchor %} - -Ensure that your web server is returning a 2xx response to our servers. Any other response type will result in our server retrying a POST until we receive a 2xx response or the maximum time has expired. All events are retried at increasing intervals for up to 24 hours after the event occurs. Make sure you are not blocking our IPs that are trying to POST to your server. Our IPs change often since we constantly add more machines. - -You can use the "Test Your Integration" button on the Event Notifications settings page to send simulated events to your callback URL. You can also send a POST from a shell using cURL. This will give you the full response your server is returning including the HTTP headers. - -{% codeblock lang:bash %} -curl -X POST -H "Content-Type: application/json" -d '[{"email":"john.doe@sendgrid.com","timestamp":1337197600,"smtp-id":"<4FB4041F.6080505@sendgrid.com>","event":"processed"},{"email":"john.doe@sendgrid.com","timestamp":1337966815,"category":"newuser","event":"click","url":"https://sendgrid.com"},{"email":"john.doe@sendgrid.com","timestamp":1337969592,"smtp-id":"<20120525181309.C1A9B40405B3@Example-Mac.local>","event":"processed"}]' -{% endcodeblock %} - - -{% anchor h2 %} -Version Differences -{% endanchor %} -The primary difference between v2 (no longer available) and v3 of the Event Webhook is that Version 3 delivers events as JSON arrays, whereas the previous version delivered batched JSON as JSON documents separated by line breaks. Furthermore, v3 provides more data with certain events. The [previous version of the webhook's documentation]({{root_url}}/API_Reference/Webhooks/event_deprecated.html) is still provided so you can compare them. diff --git a/source/API_Reference/Webhooks/event_deprecated.md b/source/API_Reference/Webhooks/event_deprecated.md deleted file mode 100644 index b1215fa405..0000000000 --- a/source/API_Reference/Webhooks/event_deprecated.md +++ /dev/null @@ -1,462 +0,0 @@ ---- -layout: page -weight: 0 -title: Event V1/V2 (deprecated) -navigation: - show: true ---- - -{% warning %} -V1 and V2 of this webhook are deprecated. [Version 3]({{root_url}}/API_Reference/Webhooks/event.html) is the recommended option and the only option available to new users. -{% endwarning %} - -{% anchor h2 %} -Requests -{% endanchor %} - -You have the option to receive a **HTTP POST** request for each event ("Version 1") or to receive a batch of multiple events in one request after a very short delay ("Version 2"). These POSTs will be sent to the URL you have defined in the Event Notification setting options. - -SendGrid expects a 200 HTTP response to the POST, otherwise the event notification will be retried. If your URL returns a non-200 HTTP code it will be deferred and retried for 24 hours. The maximum number of deferred POSTs in the retry queue is 100,000. If the queue is full, the oldest request in the queue will be removed to make room for the newest deferred POST. This means that if you use batched events these events will drop 24 hours before the queue can max out. Events that cannot be submitted within the maximum retry period or events removed from the defer queue will be lost. - -{% warning %} -If your email traffic generates a lot of events, the incoming amount of data can easily overload a web server if not configured properly for scalability. To reduce the number of requests to your server, enable the batched events option. - - Keep in mind that even with batched events enabled, your servers can potentially see a large number of POSTs from the webhook as we POST batches from multiple servers. You can load test your endpoints with [loader.io](http://loader.io) for free. -{% endwarning %} - -{% anchor h2 %} -Event Types -{% endanchor %} - -The following lists the events generated by SendGrid. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      EventCriteria
      ProcessedMessage has been received and is ready to be delivered.
      DroppedYou may see the following drop reasons:- Invalid SMTPAPI header- Spam Content (if spam checker setting enabled)- Unsubscribed Address- Bounced Address- Spam Reporting Address- Invalid
      DeliveredMessage has been successfully delivered to the receiving server.
      DeferredRecipient's email server temporarily rejected message.
      BounceReceiving server could not or would not accept message.
      OpenRecipient has opened the HTML message.
      ClickRecipient clicked on a link within the message.
      Spam ReportRecipient marked message as spam.
      UnsubscribeRecipient clicked on messages's subscription management link.
      - -The following image shows where events can be generated as email is being processed: - -![]({{root_url}}/images/event_1.jpg "Event Flow") - -{% anchor h2 %} - - -Default Parameters -{% endanchor %} - -The following parameters are always passed with each event and some events include additional parameters. A category name and custom argument may also be passed. Please see the Custom Parameters and Categories section below for more information. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      ParameterDescription
      eventOne of: bounce, click, deferred, delivered, dropped, processed, open, spamreport, unsubscribe
      emailEmail address of the intended recipient
      useragentThe user agent responsible for the event, e.g. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
      ipThe IP Address where the event originated.
      sg_event_idA unique id for the event. This is a 23 byte string.
      - -{% anchor h2 %} -Unique Arguments and Categories -{% endanchor %} - -Events generated by SendGrid can also include unique arguments. To define and receive custom parameters in your URL the [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html) must be used when sending emails using the *unique_args* argument. For example, if you have an application and want to receive custom parameters such as the user id and the email template name, include the following in your SMTP headers as X-SMTPAPI or as the xsmtpapi parameter of your Web API call: - -{% codeblock lang:json %} -{ - "unique_args": { - "userid": "1123", - "template": "welcome" - } -} -{% endcodeblock %} - -Either of those emails will generate the following HTTP POST request to your application when the email is opened: - -{% codeblock %} -email=emailrecipient@domain.com&event=open&userid=1123&template=welcome -{% endcodeblock %} - -{% anchor h2 %} -Categories - -{% endanchor %} -

      If a category is used over the SMTP API to get detailed statistics for user signups in addition to custom parameter, include the following in your SMTP headers as X-SMTPAPI or as the xsmtpapi parameter of your Web API call:

      - -{% codeblock lang:json %} -{ - "unique_args": { - "userid": "1123", - "template": "welcome" - }, - "category": "user_signup" -} -{% endcodeblock %} - -Either of those emails will generate the following HTTP POST request to your application when the email is opened: - -{% codeblock %} -email=emailrecipient@domain.com&event=open&userid=1123&template=welcome&category=user_signup -{% endcodeblock %} - -{% info %} -If you apply multiple categories to any of your outgoing messages, the returned data will be in the form of an array. - -{% endinfo %} - -{% anchor h2 %} -Batched Events (Version 2) - -{% endanchor %} -

      Batched event POSTs have a content-type header of application/json, and contain exactly one JSON string per line, with each line representing one event. Please note that currently the POST headers define this post as application/json, though it's not; each line is a valid JSON string, but the overall POST body is not. For example:

      - -{% codeblock lang:javascript %} -{"email":"foo@bar.com","timestamp":1322000095,"unique_arg":"my unique arg","event":"delivered"} -{"email":"foo@bar.com","timestamp":1322000096,"unique_arg":"my unique arg","event":"open"} - -{% endcodeblock %} - - -{% info %} -Batched events currently post every 1 second, or when the batch size reaches 1MB (one megabyte), whichever occurs first. -{% endinfo %} - -{% info %} -Batching your events is recommended to reduce server load and reduce the number of open connections. -{% endinfo %} - -{% anchor h2 %} -Examples -{% endanchor %} -The following examples will use PHP language, the Web API to send email using *curl*, and the [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html) for the *X-SMTPAPI* parameter when sending email. Many times it is useful to see all parameters that are being POSTed. The following example receives a **batched** POST and dumps the parameters to a log file located at /tmp/dump.log: - -{% codeblock lang:php %} - ok -{% endcodeblock %} - - If you're **not batching**, the code would look like: - -{% codeblock lang:php %} - ok -{% endcodeblock %} - - -{% info %} -If you are using a hosting service, you don't have direct access to the server's file system. In that case, you need to modify the path for the dump log to be somewhere you *do* have access to. In most cases, the second line in the code above... -{% endinfo %} - -{% codeblock lang:php %} - -{% endcodeblock %} - - should be changed to... - -{% codeblock lang:php %} - -{% endcodeblock %} - - -{% anchor h2 %} -Parameter Details -{% endanchor %} - -The following shows each type of event that can be posted along with the specific parameters that go along with the event. - -{% info %} -You can use the SMTP API to specify additional custom parameters including categories and unique args. Each unique arg is posted as a separate post parameter, similar to the category listed below, but with a custom name specified by you. -{% endinfo %} - -{% anchor h2 %} -Processed -{% endanchor %} - - - - - - - - - - - - - - - - -
      eventemailcategory
      processedMessage recipientThe category you assigned
      - -{% anchor h2 %} -Deferred -{% endanchor %} - - - - - - - - - - - - - - - - - - - - -
      eventemailresponseattemptcategory
      deferredMessage recipientFull reponse from MTADelivery attempt #The category you assigned
      - -{% anchor h2 %} -Delivered -{% endanchor %} - - - - - - - - - - - - - - - - - - -
      eventemailresponsecategory
      deliveredMessage recipientFull reponse from MTAThe category you assigned
      - -{% anchor h2 %} -Open -{% endanchor %} - - - - - - - - - - - - - - - - -
      eventemailcategory
      openMessage recipientThe category you assigned
      - -{% anchor h2 %} -Click -{% endanchor %} - - - - - - - - - - - - - - - - - - -
      eventemailurlcategory
      clickMessage recipientURL ClickedThe category you assigned
      - -{% anchor h2 %} -Bounce -{% endanchor %} - - - - - - - - - - - - - - - - - - - - - - -
      eventemailstatusreasontypecategory
      bounceMessage recipient3-digit status codeBounce reason from MTABounce/Blocked/ExpiredThe category you assigned
      - -{% anchor h2 %} -Drop -{% endanchor %} - - - - - - - - - - - - - - - - - - -
      eventemailreasoncategory
      droppedMessage recipientDrop reasonThe category you assigned
      - -{% anchor h2 %} -Spam Report -{% endanchor %} - - - - - - - - - - - - - - - - -
      eventemailcategory
      spamreportMessage recipientThe category you assigned
      - -{% anchor h2 %} -Unsubscribe -{% endanchor %} - - - - - - - - - - - - - - - - -
      eventemailcategory
      unsubscribeMessage recipientThe category you assigned
      - -{% anchor h2 %} -Troubleshooting -{% endanchor %} - -Ensure that your web server is returning a 200 response to our servers. Any other response type will result in our server retrying a POST until we receive a 200 response or the maximum time has expired. All events are retried at increasing intervals for up to three days after the event occurs. Make sure you are not blocking our IPs and that you are trying to POST to your server. Our IPs change often since we constantly add more machines. You can also try a test POST yourself from a terminal by running the following command. This will give you the full response your server is returning including the HTTP headers. - -{% codeblock lang:bash %} -curl -i -d 'email=test@gmail.com&arg2=2&arg1=1&category=testing&event=processed' -{% endcodeblock %} diff --git a/source/API_Reference/Webhooks/index.html b/source/API_Reference/Webhooks/index.html deleted file mode 100644 index cff8b0acca..0000000000 --- a/source/API_Reference/Webhooks/index.html +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: page -weight: 750 -title: Webhooks Overview -navigation: - show: true ---- - -

      Webhooks are an easy way to get push notifications. A webhook is like an inverted API endpoint; instead of making a call to our API, you define a callback URL to which we will HTTP POST information as things happen. Your callback URL can then execute code based on the POSTs. You can think of it as defining an API endpoint for your app that will receive output from SendGrid.

      - -

      We currently have two Webhooks available. The Event Webhook will POST when an email event occurs, such as a bounce or an unsubscribe. The Inbound Parse Webhook receive emails and then POSTs their constituent parameters (e.g. subject, body, and attachments) to a URL that you choose.

      - -{% anchor h2 %} -Debugging -{% endanchor %} - -

      Webhooks can be hard to debug, for this reason we provide a guide to debug webhooks.

      - -{% anchor h2 %} -Caveats -{% endanchor %} - -

      -Keep in mind that your servers need to be robust enough to handle a -large number of requests from SendGrid's webhooks, especially if you -send or receive a lot of email. diff --git a/source/API_Reference/api_getting_started.md b/source/API_Reference/api_getting_started.md new file mode 100644 index 0000000000..825e82d0d2 --- /dev/null +++ b/source/API_Reference/api_getting_started.md @@ -0,0 +1,90 @@ +--- +seo: + title: Getting Started with the SendGrid API + description: Sending your first email using the SendGrid REST API. + keywords: Getting Started, API, v3, REST, SendGrid REST API +title: Getting Started with the SendGrid API +weight: 100 +layout: page +navigation: + show: true +--- + +* [Prerequisites](#-Prerequisites) +* [How to send an API email](#-How-to-send-an-API-email) + * [Build your API call](#-Build-your-API-call) + * [Send-your-email-using-the-API](#-Send-your-email-using-the-API) + * [API Response messages](#-API-Response-messages) +* [Next steps](#-Next-steps) + +{% anchor h2 %} +Prerequisites +{% endanchor %} + +These instructions describe how to send your first email using cURL calls. This is one of many ways to send email with the SendGrid - we also have [PHP](https://github.com/sendgrid/sendgrid-php), [Python](https://github.com/sendgrid/sendgrid-python), [Node.js](https://github.com/sendgrid/sendgrid-nodejs), [Java](https://github.com/sendgrid/sendgrid-java), [C#](https://github.com/sendgrid/sendgrid-csharp), [Go](https://github.com/sendgrid/sendgrid-go), and [Ruby](https://github.com/sendgrid/sendgrid-ruby) libraries. + +Before you can start using the API, you need to do the following: + +1. Create a SendGrid [account](https://sendgrid.com/pricing/). +1. Create an [API Key]({{root_url}}/User_Guide/Settings/api_keys.html). +1. Make sure you have [curl](https://curl.haxx.se/) installed on your machine. + +{% info %} +Curl comes standard on Mac operating systems. +{% endinfo %} + +{% anchor h2 %} +How to send an API email +{% endanchor %} + +{% anchor h3 %} +Build your API call +{% endanchor %} + +Your API call must have the following components: + +* A Host. The host for Web API v3 requests is always https://sendgrid.com/v3/ +* An [Authorization Header](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-authentication#authorization-header) +* An [API Key]({{root_url}}/User_Guide/Settings/api_keys.html) within the Authorization Header +* A Request. When submitting data to a resource via POST or PUT, you must submit your payload in JSON. + +{% anchor h3 %} +Send your email using the API +{% endanchor %} + +_To Send an email using the SendGrid API:_ + +{% codeblock %} +curl --request POST \ +--url https://api.sendgrid.com/v3/mail/send \ +--header 'authorization: Bearer <>' \ +--header 'content-type: application/json' \ +--data '{"personalizations":[{"to":[{"email":"john.doe@example.com","name":"John Doe"}],"subject":"Hello, World!"}],"from":{"email":"sam.smith@example.com","name":"Sam Smith"},"reply_to":{"email":"sam.smith@example.com","name":"Sam Smith"}}'{% endcodeblock %} + +1. Copy the curl example above. +2. Paste the curl call into your favorite text editor. +3. Copy your API key and paste it in the authorization header. +4. In the data section, specify the "to", "from", and "reply to" names and email addresses and enter a subject. +5. Copy the code and paste it in your terminal. +6. Hit **Enter**. +7. Check the inbox of the address you specified as the "to" email and see your message! + +{% info %} +If you have not yet set up [Sender Authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) in your account, you may need to check your spam folder for the email you just sent. +{% endinfo %} + +{% anchor h3 %} +API Response messages +{% endanchor %} + +All responses are returned in JSON format. We specify this by sending the ``Content-Type`` header. The Web API v3 provides a selection of [response codes](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#status-codes),[content-type headers](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#content-type-header), and [pagination](https://sendgrid.api-docs.io/v3.0/how-to-use-the-sendgrid-v3-api/api-responses#pagination) options to help you interpret the responses to your API requests. + +{% anchor h2 %} +Next Steps +{% endanchor %} + +For more information on SendGrid and where you can go from here, check out these pages: + +- [API Reference]({{root_url}}/API_Reference/api_v3.html) +- [Sender Authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) +- [How to Send Email]({{root_url}}/User_Guide/Marketing_Campaigns/getting_started.html) diff --git a/source/API_Reference/index.html b/source/API_Reference/index.html index 7cd0265d91..65b1d9ef7e 100644 --- a/source/API_Reference/index.html +++ b/source/API_Reference/index.html @@ -84,6 +84,6 @@

      SMTPAPI

      {% endanchor %}
        -
      • Reseller API - Allows SendGrid Reseller Cutomers to manage every aspect of their customer's SendGrid accounts.
      • +
      • Reseller API - Allows SendGrid Reseller Customers to manage every aspect of their customer's SendGrid accounts.
      • Reseller Haiku API - Allows SendGrid Reseller Customers to manage servers and accounts through SendGrid.
      diff --git a/source/Apps/index.html b/source/Apps/index.html index b9096f99f4..70cec42825 100644 --- a/source/Apps/index.html +++ b/source/Apps/index.html @@ -2,15 +2,15 @@ Redirecting... - + - +

      Redirecting...

      -

      Click here if you are not redirected.

      +

      Click here if you are not redirected.

      diff --git "a/source/Classroom/Basics/API/Icon\r" "b/source/Classroom/Basics/API/Icon\r" deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/source/Classroom/Basics/API/api_key_permissions.md b/source/Classroom/Basics/API/api_key_permissions.md index 66283f9244..0422d9db60 100644 --- a/source/Classroom/Basics/API/api_key_permissions.md +++ b/source/Classroom/Basics/API/api_key_permissions.md @@ -40,6 +40,8 @@ How can I use API Key permissions? General API Keys {% endanchor h3 %} +{% info %} There is a limit of 100 API Keys per account. {% endinfo %} + To create a new General API Key and assign it permissions, first navigate to your Settings and select API Keys. This page displays your current API Keys. To create a new key, click the Create API Key button and select "General API Key". ![]({{root_url}}/images/select_general_api_key.png) @@ -75,6 +77,8 @@ You will then be able to name your key and assign it permissions. ![]({{root_url}}/images/select_billing_api_key_permissions.png) +{% info %} There is a limit of 100 API Keys per account. {% endinfo %} + API Key permissions are not permanent and may be changed any time after the key has been created. Simply click the gear icon next to the API Key you would like to make changes to, and click "Edit Details". ![]({{root_url}}/images/editing_api_keys.png) @@ -82,7 +86,7 @@ API Key permissions are not permanent and may be changed any time after the key Several specific use cases for an API Key and the permissions that you might want to assign to that key, are described below. A complete list of all possible permissions scopes can be found [here]({{root_url}}/API_Reference/Web_API_v3/API_Keys/api_key_permissions_list.html). {% anchor h3 %} -Adding Additional API Key Permissons Not Listed In the User Interface +Adding Additional API Key Permissions Not Listed In the User Interface {% endanchor h3 %} As it turns out, the [API Key Permissions List](https://sendgrid.com/docs/API_Reference/Web_API_v3/API_Keys/api_key_permissions_list.html) contains more permissions that can be added to your API key than those listed when creating a new API key. Currently, when you create new key in the user interface and give it full access, it excludes additional permissions that can be added via an API call. The best way to see what permissions your API key has is by making [this call](https://sendgrid.com/docs/API_Reference/Web_API_v3/API_Keys/api_keys_permissions.html) using the same API key to make the request. @@ -116,9 +120,9 @@ Example Permissions for Common API Key Use Cases
    • Suppressions: Read Only Access
    • Suppressions: Full Access
    • Whitelabels: Read Only Access
    • -
    • Whitelabels: Full Access
    • +
    • Whitelabels: Full Access
    • IP Management: Read Only Access
    • -
    • IP Management: Full Access
    • +
    • IP Management: Full Access
    • Templates: Read Only Access
    • Templates: Full Access
    • Inbound Parse: Read Only Access
    • @@ -529,6 +533,10 @@ Below is a list of every scope included in an administrator level API Key. "suppression.unsubscribes.read", "suppression.unsubscribes.update", "suppression.update", + "teammates.create", + "teammates.delete", + "teammates.read", + "teammates.update", "templates.create", "templates.delete", "templates.read", @@ -571,6 +579,7 @@ Below is a list of every scope included in an administrator level API Key. "user.settings.enforced_tls.read", "user.settings.enforced_tls.update", "user.timezone.read", + "user.timezone.update", "user.username.read", "user.username.update", "user.webhooks.event.settings.read", diff --git a/source/Classroom/Basics/API/cors.md b/source/Classroom/Basics/API/cors.md index aac0d8ca0c..59e8b3c7f7 100644 --- a/source/Classroom/Basics/API/cors.md +++ b/source/Classroom/Basics/API/cors.md @@ -21,7 +21,7 @@ CORS implements headers in the response of any request to the server to say what Why can’t I send email in my browser application? {% endanchor %} -When you have a browser-only application that reaches out to APIs, the API key has to be embedded in the application. Anyone with access to a browser-only application can access all of the Javascript source code, including your API keys. +When you have a browser-only application that reaches out to APIs, the API key has to be embedded in the application. Anyone with access to a browser-only application can access all of the Javascript source code, including your API keys. Making your API key publicly accessible could result in anyone authenticating API calls with your API key — this is a significant security concern both for you and SendGrid. diff --git a/source/Classroom/Basics/API/how_do_i_integrate_with_sendgrid.md b/source/Classroom/Basics/API/how_do_i_integrate_with_sendgrid.md index fbbaa24a05..cde6e2377e 100644 --- a/source/Classroom/Basics/API/how_do_i_integrate_with_sendgrid.md +++ b/source/Classroom/Basics/API/how_do_i_integrate_with_sendgrid.md @@ -13,7 +13,7 @@ navigation: There are many different ways to use SendGrid’s email services, so it all comes down to what _you_ need. We have numerous examples for how to configure mail clients such as Outlook and Apple Mail to send through our system as well as integration examples for a multitude of [programming languages and libraries](https://sendgrid.com/docs/Integrate/libraries.html) on our **[SendGrid Integration Page](http://sendgrid.com/docs/Integrate/index.html).** -#**The main ways to integrate with Sendgrid:** +#**The main ways to integrate with SendGrid:** - **[SMTP]({{root_url}}/Classroom/Basics/Email_Infrastructure/what_is_smtp.html)** - Send with a desktop mail client, or existing program/service using [your SMTP credentials]({{root_url}}/Classroom/Basics/Email_Infrastructure/recommended_smtp_settings.html). - **[Web API](https://sendgrid.com/docs/API_Reference/Web_API/index.html)** - Send from your app using [your api key]({{root_url}}/Classroom/Basics/API/what_is_my_api_key.html). Check out our [API Guide](http://go.sendgrid.com/rs/sendgrid/images/SendGrid_API_Guide-101.pdf) for more info. @@ -23,6 +23,6 @@ There are many different ways to use SendGrid’s email services, so it all come ##**Things to consider before you start sending:** -- We recommend that all Pro and higher users complete [Whitelabeling]({{root_url}}/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.html). This process helps your emails look as consistant as possible by masking Sendgrid in the sending process. When properly whitelabeled, your emails have the appearance of coming directly from your own domain, which is important for building and maintaining your sending reputation. -- Consider implementing the [Event API](http://sendgrid.com/docs/API_Reference/Webhooks/event.html) to track and log your email data more thoroughly. For more info on the benefits of Event API, check out our [Why Event API]({{root_url}}/Classroom/Basics/API/why_event_api.html) article. +- We recommend that all Pro and higher users complete [Whitelabeling]({{root_url}}/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.html). This process helps your emails look as consistent as possible by masking SendGrid in the sending process. When properly whitelabeled, your emails have the appearance of coming directly from your own domain, which is important for building and maintaining your sending reputation. +- Consider implementing the [Event API]({{root_url}}/API_Reference/Event_Webhook/event.html) to track and log your email data more thoroughly. For more info on getting started, check out our [Getting Started with the Event Webhook]({{root_url}}/API_Reference/Event_Webhook/getting_started_event_webhook.html) article. - We _**highly**_ recommend that if you are a Pro or higher customer, you [warm up your IP](https://sendgrid.com/docs/User_Guide/warming_up.html) as part of your getting started checklist. Warming up is one of the best ways to prevent delivery issues down the road by getting receivers used to the type of messages you will be sending. diff --git a/source/Classroom/Basics/API/how_to_create_a_subuser_with_the_api.md b/source/Classroom/Basics/API/how_to_create_a_subuser_with_the_api.md index c318c511a5..d012b30fc6 100644 --- a/source/Classroom/Basics/API/how_to_create_a_subuser_with_the_api.md +++ b/source/Classroom/Basics/API/how_to_create_a_subuser_with_the_api.md @@ -15,7 +15,7 @@ navigation: **1. Establish the New Subuser ** (required) -With the [subuser creation API call](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/subusers.html) you will be able to establish the new subuser's account and profile settings. This call will create the new subuser account, however it does not apply the sending IP for the account, nor does it establish a whitelabel entry or enable website/SMTP access for the subuser. +With the [subuser creation API call](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/subusers.html) you will be able to establish the new subuser's account and profile settings. This call will create the new subuser account, however it does not apply the sending IP for the account, nor does it establish a domain authentication entry or enable website/SMTP access for the subuser. **Call Example:** https://api.sendgrid.com/apiv2/customer.add.json?api\_user=ryan.burrer@sendgrid.com&api\_key=xxxxxx&username=newsubuser\_username&website=yourdomain.com&password=newsubuser\_password&confirm\_password=newsubuser\_password&first\_name=Ryan&last\_name=Burrer&address=555\_anystreet&city=any\_city&state=CO&zip=80203&email=example@example.com&country=US&phone=555-5555 @@ -33,7 +33,7 @@ Now that you have created the new subuser account, you will need to [add an IP]( When defining the parameter 'list' there are a few options you can choose: - **All ** = Will list all of the IPs on your account, taken or available. -- **Free ** = Will list all the free IPs on your account. For instance, if an IP is in use by a subuser or parent account then that IP will not be listed. +- **Free ** = Will list all the free IPs on your account. For instance, if an IP is in use by a subuser or parent account then that IP will not be listed. - **Taken ** = Will list all of the IP addresses that are assigned to your parent and/or subuser accounts. - **Available ** = Will list all of the unassigned IP addresses for the account. If a subuser is deactivated _and it _is assigned an IP, that IP will show up on this list since that IP address is not technically in use.
      @@ -50,38 +50,38 @@ When defining this call's 'set' parameter, you have a few options for appending - **All ** = applies all of the possible IPs to the account. - **Specify** = Specify the IPs to the subuser
      -Success Message -

      -Failure Message -

      +Success Message +

      +Failure Message +

      -**3. Assign a Whitelabel for the Subuser Account ** (optional) +**3. Assign a domain authentication for the Subuser Account ** (optional) -After you have created the subuser account and have appended an IP address, you are now ready to assign an _existing_ [whitelabel](https://sendgrid.zendesk.com/hc/en-us/articles/200548228-All-You-Need-to-Know-About-Whitelabeling) to the account. If you have not yet created the required records for whitelabeling for your chosen domain then this step should be skipped. Unfortunately, new whitelabel records cannot be established through API calls. +After you have created the subuser account and have appended an IP address, you are now ready to assign an _existing_ [authenticated domain](https://sendgrid.com/docs/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) to the account. If you have not yet created the required records for authenticating your chosen domain then this step should be skipped. -First, you should find out what whitelabel entries you have associated with your account. This call will [list your available whitelabel domains](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/whitelabel.html#-List): +First, you should find out what authenticated domains you have associated with your account. This call will [list your available authenticated domains](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/whitelabel.html#-List): **Call Example: ** https://api.sendgrid.com/apiv2/customer.whitelabel.json?api\_user=ryan.burrer@sendgrid.com&api\_key=xxxxxx&task=list
      -Response Example -

      +Response Example +

      -The API response above shows that email.sendgrid.com and email.example.com are both already established whitelabel entries, and can be used by this subuser. If none are displayed then the next step in this process should be skipped. +The API response above shows that email.sendgrid.com and email.example.com are both already established domain entries, and can be used by this subuser. If none are displayed then the next step in this process should be skipped. -If you have a whitelabel entry that you wish to apply to your subuser then you will need to [append the whitelabel entry](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/whitelabel.html#-Append) to your subuser: +If you have a authenticated domain entry that you wish to apply to your subuser then you will need to [append the whitelabel entry](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/whitelabel.html#-Append) to your subuser: **Call Example:** https://api.sendgrid.com/apiv2/customer.whitelabel.json?api\_user=ryan.burrer@sendgrid.com&api\_key=xxxxxx&task=append&user=newsubuser\_username&mail\_domain=YOUR.ALREADY.EXISTING.WHITELABEL
      -Success Message -

      -Failure Message -

      +Success Message +

      +Failure Message +

      **4. Authenticating the Subuser to Have Website/SMTP Access ** (required) @@ -91,10 +91,10 @@ The final step in creating your new subuser requires you to simply [activate the **Call Example:** https://api.sendgrid.com/apiv2/customer.auth.json?api\_user=ryan.burrer@sendgrid.com&api\_key=xxxxxx&user=newsubuser\_username&password=newsubuser\_password
      -Success Message -

      -Failure Message -

      +Success Message +

      +Failure Message +


      That's All, Folks! @@ -102,12 +102,12 @@ The final step in creating your new subuser requires you to simply [activate the If you have followed all of these steps then you have just created a new subuser using the Subuser API. Give yourself a high five! -But wait, there's more... +But wait, there's more... -Now that you have created a new subuser you can change the [Event Notification URL](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/event_notification_url.html), the subuser's enabled [apps](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/apps.html), and even set [account limits](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/account_limits.html) for the subuser. +Now that you have created a new subuser you can change the [Event Notification URL](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/event_notification_url.html), the subuser's enabled [apps](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/apps.html), and even set [account limits](http://sendgrid.com/docs/API_Reference/Customer_Subuser_API/account_limits.html) for the subuser. -
      -

       

      +
      +

       

      diff --git a/source/Classroom/Basics/API/http_posting_the_right_way.md b/source/Classroom/Basics/API/http_posting_the_right_way.md index 046a3b5d77..11674f01af 100644 --- a/source/Classroom/Basics/API/http_posting_the_right_way.md +++ b/source/Classroom/Basics/API/http_posting_the_right_way.md @@ -23,7 +23,7 @@ An example using Curl which is not correct (when used on the command line): $ curl https://sendgrid.com/api/mail.send.json?api_user=MyName&api_key=MyPassword&to=to@email.com&from=from@email.com&text=some+really+long+text+also+notice+how+this+is+all+part+of+the+mail.send.json+URI -The above Curl request is putting all of the parameters as part of the URL (https://sendgrid.com/api/mail.send.json) instead as seperate fields. +The above Curl request is putting all of the parameters as part of the URL (https://sendgrid.com/api/mail.send.json) instead as separate fields. Resolution/Best Practices: When performing the HTTP POST, ensure that the parameters are being posted as part of the body instead of with the URI. diff --git a/source/Classroom/Basics/API/what_are_the_sendgrid_apis_and_what_do_they_do.md b/source/Classroom/Basics/API/what_are_the_sendgrid_apis_and_what_do_they_do.md index 6c54d4007a..5a6c745a33 100644 --- a/source/Classroom/Basics/API/what_are_the_sendgrid_apis_and_what_do_they_do.md +++ b/source/Classroom/Basics/API/what_are_the_sendgrid_apis_and_what_do_they_do.md @@ -23,7 +23,7 @@ The SendGrid APIs allow you to interact with our system in a number of different -**Event Webhook** – The Event Webhook gives you full sending logs from the moment of implementation and allows you to create reports of activity and statistics far beyond what is provided on sendgrid.com. The Event Webhook requires you to setup a URL where we HTTP POST your account activity as it takes place. Automated systems can also be built to take action when specific events, such as an Open, Click or Unsubscribe, occur. Please visit our [SendGrid Event Webhook Documentation](http://sendgrid.com/docs/API_Reference/Webhooks/event.html) page for more information. We also have a great article about [why setting up the SendGrid Event Webhook for your account is an excellent idea]({{root_url}}/Classroom/Basics/API/why_event_api.html). +**Event Webhook** – The [Event API]({{root_url}}/API_Reference/Event_Webhook/event.html) gives you full sending logs from the moment of implementation and allows you to create reports of activity and statistics far beyond what is provided on sendgrid.com. The Event Webhook requires you to setup a URL where we HTTP POST your account activity as it takes place. Automated systems can also be built to take action when specific events, such as an Open, Click or Unsubscribe, occur. For more info on getting started, check out our [Getting Started with the Event Webhook]({{root_url}}/API_Reference/Event_Webhook/getting_started_event_webhook.html) article. diff --git a/source/Classroom/Basics/API/why_event_api.md b/source/Classroom/Basics/API/why_event_api.md deleted file mode 100644 index 11fd9e70c1..0000000000 --- a/source/Classroom/Basics/API/why_event_api.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -seo: - title: Why Event API? - description: Why Event API? - keywords: event, webhook, notification, api -title: Why Event API? -weight: 0 -layout: page -zendesk_id: 200182028 -navigation: - show: true ---- - -Wouldn't it be nice if you could get information about every email you've ever sent, every message that's ever been opened, and any link that's ever been clicked? If you ever talk to SendGrid Support agents, we'll almost always recommend implementing our Event API to help you track these sorts of metrics. This article highlights the major benefits of the Event API and why we constantly recommend it! - -Due to the sheer volume of email we send (over 1 _billion_ emails a _day_ as of April 2016), we can only store so much information regarding the emails passing through our system. Your [Activity Feed](https://app.sendgrid.com/email_activity?) page holds records up to 500 events, and our internal database records also only go back about 30 days. After that time passes, specific email data is gone(stats are permanent). - - -Fortunately, you can receive and store all of this information on your end though by implementing our **[Event API!](https://sendgrid.com/docs/API_Reference/Webhooks/index.html)**. - - -The Event API, available with all Essentials and higher accounts, provides HTTP POSTs for any and all requested account activity as it takes place. The Event data for the event types you specify is then posted to a URL of your choosing in real-time! The Event API can tell you who opened what email and clicked which link as far back as the records you've recorded go. [Events](http://docs.sendgrid.com/documentation/delivery-metrics/) we can POST include Processed, Delivered, Opens, Clicks, Unsubscribes, Spam Reports, Deferred, Bounces, and Drops with all relevant Category and Unique Argument information. This potentially gives you the entire sending activity of your account and is only restricted by your own internal storage limitations. Additionally, as Events are posted real time, you could potentially build automated systems on your end to take action, such as removing an Unsubscribed address from your master mailing list, or firing off a seperate email based on a specific action. - - -Although it does require a fair amount of setup, the benefits of the Event API are paramount. More information about setup can be found in our [SendGrid Event API Documentation](https://sendgrid.com/docs/API_Reference/Webhooks/index.html). If you have any specific questions about the Event API please do not hesitate to contact our Support team via email, chat, or phone call. - -Need additional functionality with your Event API integration? Check out the open-source [Event Kit App](https://github.com/sendgrid/eventkit-rails), also check out our friends over at [Keen.io](https://keen.io/) who provide a place to receive POST data. diff --git "a/source/Classroom/Basics/Account/Icon\r" "b/source/Classroom/Basics/Account/Icon\r" deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/source/Classroom/Basics/Account/account_sign_up_faq.md b/source/Classroom/Basics/Account/account_sign_up_faq.md index 9576460c7f..1d7f7932db 100644 --- a/source/Classroom/Basics/Account/account_sign_up_faq.md +++ b/source/Classroom/Basics/Account/account_sign_up_faq.md @@ -13,7 +13,7 @@ navigation: show: true --- -When you sign up for a SendGrid account, there are a few steps that our users must complete before they can start using their accounts fully. You will have either one, two, or three seperate steps to complete before you fully unlock the credit limits available to your chosen plan level. We require these steps for your security, as well as to help you get started more quickly! +When you sign up for a SendGrid account, there are a few steps that our users must complete before they can start using their accounts fully. You will have either one, two, or three separate steps to complete before you fully unlock the credit limits available to your chosen plan level. We require these steps for your security, as well as to help you get started more quickly! {% anchor h3 %}How long does the verification process take?{% endanchor %} @@ -22,11 +22,11 @@ The time it takes to completely unlock your account can vary based on the number {% anchor h3 %}What steps are required?{% endanchor %} -You will either have to verify your email address, set up two-factor authentication, and/or create a domain whitelabel. You may need to complete one or more of these steps to completely verify your account. +You will either have to verify your email address, set up two-factor authentication, and authenticate a domain . You may need to complete one or more of these steps to completely verify your account. {% anchor h3 %}Can I send email right away?{% endanchor %} -Yes, you can send up to 100 emails per day even when your account is in a pre-verified state. +Yes, you can send up to 100 emails per day even when your account is in a pre-verified state. {% anchor h3 %}Can I skip a verification step?{% endanchor %} diff --git a/source/Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.md b/source/Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.md deleted file mode 100644 index 536c08027d..0000000000 --- a/source/Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -seo: - title: Adding an additional dedicated IP to your account - description: Add more dedicated IPs to your account... -keywords: add, additional, more, new, IP, address, purchase, dedicated, account, another, need, IPs, new, warmup -title: Adding an additional dedicated IP to your account -weight: 0 -layout: page -navigation: - show: true ---- - -To add additional IPs to your Pro or Premier account, first log into your account, and then click "Add a Dedicated IP" on the [Plan & Billing Details](https://app.sendgrid.com/settings/billing) page. - -New IP addresses can be entered into [automated warmup]({{root_url}}/Classroom/Basics/Misc/automated_ip_warmup.html) as long as you have [another IP address](https://app.sendgrid.com/settings/ip_addresses) that has been active for more than 30 days, and has been whitelabeled. For best results, be sure to whitelabel newly added IP addresses as per the instructions provided in the workflow *before* you start sending with it. - -We do not recommend adding a new IP to automated warmup if you have no other IP addresses that are either not warmed up, or are less than 30 days old. In these cases, we recommend that you [warm up your new IP manually](https://sendgrid.com/docs/Classroom/Deliver/Delivery_Introduction/warming_up_ips.html). - -Purchasing and adding dedicated IPs can only be performed by the Parent account, or Teammates with either Billing or Admin permissions. - -**Additional IPs cost an extra $30 per additional IP per month. You may only add up to 3 new IP addresses to your account per month** diff --git a/source/Classroom/Basics/Account/creating_teammates_for_subusers.md b/source/Classroom/Basics/Account/creating_teammates_for_subusers.md deleted file mode 100644 index c12602cfa5..0000000000 --- a/source/Classroom/Basics/Account/creating_teammates_for_subusers.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -seo: - title: Creating Teammates for Subusers - description: Learn how to create teammates for subusers! - keywords: subuser, permission, teammates -title: Creating Teammates for Subusers -weight: 0 -layout: page -zendesk_id: 205360047 -navigation: - show: true ---- - -## What is a teammate? - -Teammates is an account administrator and security tool that allows admins to grant access to a SendGrid account to individual "teammates". These teammates may be granted access to all of an account's features and information, or the administrator may choose to only grant a teammate limited access specific to that teammate's role and responsibilities. For additional general information about Teammates, please see our [User Guide]({{root_url}}/User_Guide/Settings/teammates.html). - -## Creating Teammates for Subusers - -The process of creating teammates is no different for subusers than for parent users. However, it is important to note that while subusers have complete control over their teammates, the parent account is able to create, manage, and delete any teammate created by, or for, a subuser. - -{% info %} -Subuser teammates will only have access to the subuser account! -{% endinfo %} - -Teammates can be created and managed both via the user interface and the v3 Web API. If you are creating a teammate via the v3 Web API, you can use one of our 7 libraries, or you may make a cURL request. - -### Using the User Interface - -In order to create a teammate, you must first send out a teammate invitation, since the individual who will be using the teammate account is ultimately responsible for setting up the teammate account. Parent and subuser admins are only able to send teammate invitations, they are not able to create a teammate. - -{% info %} -Teammate invitations are valid for up to 7 days. -{% endinfo %} - -To send a teammate invitation, navigate to **Settings** in the left hand sidebar and click on **Teamamtes**. Click the **Add Teammate** button. - -A window will appear titled "Invite Teammate". Enter the email address for the individual you want to create a teammate for, and select the teammate permissions. - -Teammate permissions may be either: - -* **"Admin"** - administrator teammates have full access to all of the subuser's account features and settings. -* **"Read-Only Access"** - teammates with read-only permissions will be able to view all of the subuser's account features and settings, but they won't be able to make any changes. -* **"Restricted Access"** - teamamtes with restricted access will have access to only the features you specify. There are three presets: "Developer Access", "Marketer Access", and "Accountant Access". The specific permissions for each preset are displayed under **Access Details**. - -You may also customize any of these presets. You can make your own set of permissions by selecting "Custom Access" and using the sliders next to each permission under **Access Details**. - -Once you have entered the teammate's email address and have decided on the permissions you want to give that teammate, click **Invite**. - -All pending teammate invitations can be found under the tab labeled "Invited". - -### Using the v3 Web API - -To invite a teammate using the v3 Web API, please see our [Library Documentation]() or our [Web API v3 Reference]({{root_url}}/API_Reference/Web_API_v3/teammates.html). - -### Using cURL - -Example cURL request to invite a teammate: - -{% codeblock lang:bash %} -curl --request POST \ - --url https://api.sendgrid.com/v3/teammates \ - --header 'content-type: application/json' \ - --data '{"email":"example@example.com","scopes":["billing.delete", "billing.read", "billing.update"],"is_admin":false}' -{% endcodeblock %} - -The various teammate permissions are specified within the `scopes` array. The example shown here includes the billing scopes that would be useful for a teammate primarily responsible for accounting. - - -## Related Articles - -* [User Guide]({{root_url}}/User_Guide/Settings/teammates.html) -* [Frequently Asked Questions]() -* [API Reference]({{root_url}}/API_Reference/Web_API_v3/teammates.html) diff --git a/source/Classroom/Basics/Account/how_can_i_cancel_my_account.md b/source/Classroom/Basics/Account/how_can_i_cancel_my_account.md deleted file mode 100644 index cd16479f1f..0000000000 --- a/source/Classroom/Basics/Account/how_can_i_cancel_my_account.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -seo: - title: How can I cancel my account? - description: How can I cancel my account? - keywords: service, billing, account, downgrade, cancel, bye, cancellation, close, stop -title: How can I cancel my account? -weight: 0 -layout: page -zendesk_id: 204187593 -navigation: - show: true ---- - -We're sorry to see anyone leave, but things happen and we totally understand. If you want to cancel your account, you will need to [log in](https://sendgrid.com/login) first and then you can [cancel your account here](https://app.sendgrid.com/settings/billing). - -Cancellations take full effect on the first day of the next calendar month, at which point your account will still be usable, but will be at the Free package level. - - - -We wish you the best of luck in your future email endeavors, we'll always have Paris. <3 - - diff --git a/source/Classroom/Basics/Account/how_do_i_add_more_emails_to_my_account.md b/source/Classroom/Basics/Account/how_do_i_add_more_emails_to_my_account.md index 807d2d1e58..91c7d46d9d 100644 --- a/source/Classroom/Basics/Account/how_do_i_add_more_emails_to_my_account.md +++ b/source/Classroom/Basics/Account/how_do_i_add_more_emails_to_my_account.md @@ -11,7 +11,7 @@ navigation: show: true --- -_"Can I add more emails to my account?"_ is a common question from SendGrid users, and the answer is that because of the subscription based model of SendGrid plans, _you cannot manually add more emails to an account_. **However, all plans except for the Free and Legacy Lite plans allow for overages, which means that you can send beyond your monthly allowance for a small per-email fee.** +_"Can I add more emails to my account?"_ is a common question from SendGrid users, and the answer is that because of the subscription based model of SendGrid plans, _you cannot manually add more emails to an account_. **However, all plans except for the Free and Legacy Lite plans allow for overages, which means that you can send beyond your monthly allowance for a small per-email fee.** **Free plans** have a limit of 12,000 emails per month. After 12,000 requests have been made we will simply reject your requests. It is very import to keep track of how many emails you are sending and you can see this on your account overview page. If you are on the Free plan and are in need of more emails, you will need to [upgrade your account]({{root_url}}/Classroom/Basics/Billing/how_do_i_upgrade_or_downgrade_my_account.html). diff --git a/source/Classroom/Basics/Account/how_do_i_add_more_subusers_to_my_account.md b/source/Classroom/Basics/Account/how_do_i_add_more_subusers_to_my_account.md deleted file mode 100644 index 5a2ff75027..0000000000 --- a/source/Classroom/Basics/Account/how_do_i_add_more_subusers_to_my_account.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -st: - published_at: 2016-07-13 - type: Classroom -seo: - title: How do I add more subusers to my account? - description: Learn how to increase your subuser limit beyond 15... - keywords: subuser, add, more, need, additional, users, 15, request, from, increase, limit -title: How do I add more subusers to my account? -weight: 0 -layout: page -zendesk_id: 205440758 -navigation: - show: true ---- - -By default, we limit the amount of subusers a Pro (or higher) account has to a maximum of 15. If you find yourself needing more than 15, please use the request form on the [Subuser Management](https://app.sendgrid.com/settings/subusers) page, and we can help you get more added. The form will only become available once you have reached the limit of 15 created subusers. - -We will ask a few questions about what you will be using subusers for, and the volume you might be sending over them. Don't worry though, we're only asking so we can help you have the best experience possible with your new subusers. - -Read more about what subusers are, and what features they have [here]({{root_url}}/Classroom/Basics/Account/what_are_subusers.html). diff --git a/source/Classroom/Basics/Account/how_do_i_reset_my_password.md b/source/Classroom/Basics/Account/how_do_i_reset_my_password.md index 606b1fdabb..746601b431 100644 --- a/source/Classroom/Basics/Account/how_do_i_reset_my_password.md +++ b/source/Classroom/Basics/Account/how_do_i_reset_my_password.md @@ -11,7 +11,7 @@ navigation: show: true --- ->**Please use caution**, when updating passwords, to maintain seamless email flow it is important to also update any custom code, web pages or servers that use this account with your new passwords. When changing passwords consult the email administrator who created the account if you are uncertain. +>**Please use caution**, when updating passwords, to maintain seamless email flow it is important to also update any custom code, web pages or servers that use this account with your new passwords. When changing passwords consult the email administrator who created the account if you are uncertain. **Please use one of the following 2 options to reset your password:** @@ -53,15 +53,13 @@ Forgot your password? No problem. **Want more security?** [Consider enabling 2-factor Authentication.]({{root_url}}/Classroom/Basics/Security/setting_up_2_factor_authentication.html) -**Need to reset your password without breaking your current integration?** [Learn how here.]({{root_url}}/Classroom/Basics/Account/resetting_your_password_without_breaking_current_integrations.html) - **Can't access the email address for your SendGrid account? ** [Find out how to regain access here.]({{root_url}}/Classroom/Troubleshooting/Account_Administration/cant_access_the_email_address_on_file_for_your_sendgrid_account.html) **Don't know your username?** [Get clues here.]({{root_url}}/Classroom/Troubleshooting/Account_Administration/recovering_your_username.html) **Still can't log in?** [No worries, read more options here.]({{root_url}}/Classroom/Troubleshooting/Account_Administration/cant_log_in_to_your_account.html) -**Do you have a reseller account?** Look for specific communication from your reseller. Many partners like Heroku, Appdirect, Engineyard, Softlayer, and Azure will complete this update with no action required from you. +**Do you have a reseller account?** Look for specific communication from your reseller. Many partners like Heroku, AppDirect, Engineyard, Softlayer, and Azure will complete this update with no action required from you. ->**Please use caution**, when updating passwords, to maintain seamless email flow it is important to also update any custom code, web pages or servers that use this account with your new passwords. When changing passwords consult the email administrator who created the account if you are uncertain. +>**Please use caution**, when updating passwords, to maintain seamless email flow it is important to also update any custom code, web pages or servers that use this account with your new passwords. When changing passwords consult the email administrator who created the account if you are uncertain. diff --git a/source/Classroom/Basics/Account/resetting_your_password_as_a_teammate.md b/source/Classroom/Basics/Account/resetting_your_password_as_a_teammate.md deleted file mode 100644 index 99f874d7cd..0000000000 --- a/source/Classroom/Basics/Account/resetting_your_password_as_a_teammate.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -seo: - title: Resetting Your Password As a Teammate - description: Learn how to reset your password as a teammate - keywords: password, multiauth, username, multiple, teamamtes -title: Resetting Your Password As a Teammate -weight: 0 -layout: page -zendesk_id: 205667957 -navigation: - show: true ---- - -[Teammates]({{root_url}}/User_Guide/Settings/teammates.html) is an account administration and security tool that allows admins to create and manage additional user access to SendGrid features, called teammates. These teammates may be given varying levels of access to the SendGrid account, ranging from administrator to very limited "read-only" access to specific features. - -If you have been invited to join a SendGrid account as a teammate, you will have the ability to specify your own username and password to use whenever logging into SendGrid. - -If you have a teammate account, and would like to reset your password, simply navigate to **Settings** in the left hand side bar and click on **Account Details**. Click the **Edit** button next to your username and password. - -Here you will fill in your current password, and then your new password. diff --git a/source/Classroom/Basics/Account/resetting_your_password_without_breaking_current_integrations.md b/source/Classroom/Basics/Account/resetting_your_password_without_breaking_current_integrations.md deleted file mode 100644 index af94e50f20..0000000000 --- a/source/Classroom/Basics/Account/resetting_your_password_without_breaking_current_integrations.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -seo: - title: Resetting your password without breaking current integrations - description: Resetting your password without breaking current integrations - keywords: -title: Resetting your password without breaking current integrations -weight: 0 -layout: page -zendesk_id: 205440278 -navigation: - show: true ---- - -## Step 1 - Create a New Teammate - -First, log in to your account with your primary login credentials and navigate to **Teammates** by clicking **Settings** then selecting **Teammates** in the left hand sidebar. Send yourself a new teammate invitation with at least administrator permissions, or "Full Access" to the **Mail Send** permission, at a bare minimum. Once you have received and accepted your new teammate invitation continue with Step 2. - -If your current integration is using our [Web API v2]({{root_url}}/API_Reference/Web_API/mail.html#-send), [Web API v3]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html), or one of our open sourced libraries to send mail, you'll need to set the **API Keys** permission to "Full Access". - -For more detailed instructions on creating teammates, please visit our [User Guide]({{root_url}}/User_Guide/Settings/teammates.html). - -![]({{root_url}}/images/reset_password_teammtes.png) - -## Step 2 - Update Your Integration with Your New Credentials - -Now that you have a new set of credentials for your new teammate, go into your existing system and update your integration or code to use the new teammate's username and password. Run a few tests to ensure that mail continues to flow as expected. - -## Step 3 - Deploy The Changes - -Now that your integration has the new credentials, go ahead and deploy your changes into production. - -## Step 4 - Update The Original Credentials - -Finally, once your integration is fully using your new credentials, you can go and [reset your password]({{root_url}}/Classroom/Basics/Account/how_do_i_reset_my_password.html) for your original credentials without interrupting your mail flow. - -## Step 5 (Optional) - -If you'd like, once your original credentials have been changed, you can then go and update your integration again to use the primary username and new password. Once you deploy those changes, you can go back and delete the alternate credentials you created in Step 1. - -![]({{root_url}}/images/indycareful.gif) - -Good luck, and don't hesitate to contact Support if you have any questions about the process! diff --git a/source/Classroom/Basics/Account/sending_practices.md b/source/Classroom/Basics/Account/sending_practices.md deleted file mode 100644 index 113645e83d..0000000000 --- a/source/Classroom/Basics/Account/sending_practices.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -layout: page -weight: 0 -title: Lite Plan Limitations -seo: - title: Lite Plan Limitations - description: Lite Plan Limitations -navigation: - show: true ---- - -{% warning %} -The Lite plan was discontinued for all new customers effective March 31, 2016. [Click here]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html) for more information. -{% endwarning %} - -As you begin to use your SendGrid account there are some important things to remember. For example, Legacy Lite and [Free]({{site.site_url}}/free?mc=SendGrid%20Documentation) packages have limitations in the amount of email that can be sent each day. Free accounts are limited to 12,000 emails per month. Below you will find a breakdown of the Legacy Lite package and it's limitations. - -Additionally, there are limitations to delivery rates imposed by recipient mail servers. Exceeding these limitations results in a practice referred to as throttling. Throttling in terms of email means that a recipient mail server has accepted all the mail it is willing to accept from your IP for a certain period of time. - -If you have a Pro 100k plan or higher, you may want to [read how to warm up your IP address to avoid having your outbound messaging throttled]({{root_url}}/Classroom/Deliver/warming_up_ips.html). - -{% anchor h2 %} -Legacy Lite Plan Volume Restrictions -{% endanchor %} - -Our Legacy Lite package has a bandwidth restriction to keep spammers from abusing our system. For the first 7 days you will be limited to 1,000 emails per day. After the 7th day we look into how many emails you have sent, how many days your account has been active, and check your reputation status. As the value of each of these parameters increases, your volume limitations will decrease. - -As you achieve each guideline after the 7-day period, your account limit will be raised incrementally. You must achieve all guidelines in one row before you can achieve any guideline on the next row. The below table lists the limitation factors, and how they affect your total. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Account AgeEmail RequestsSend ReputationDaily Send Limit
      0 days----1,000
      7 days *Adds 3,000*50,000 *Adds 3,000*80% *Adds 3,000*10,000
      14 days *Adds 30,000*500,000 *Adds 30,000*90% *Adds 30,000*100,000
      28 days *Adds 300,000*5,000,000 *Adds 300,000*95% *Adds 300,000*1,000,000
      - -For example: - -- If you have a 10 day old account (+3,000), have sent 10,000 messages (+0), and have a reputation of 91% (+3,000), you would have a Daily Send Limit of 7,000. -- If you have a 15 day old account, have sent 49,000 messages, and have a reputation of 99%, you would have a Daily Send Limit of 7,000, because you can't achieve the 14-day guideline until you achieve the 50,000-messages guideline. - -Please note that if your reputation declines, your limit will decrease accordingly. All these values are checked overnight, so they won't update the moment you reach the next increment of any given parameter. diff --git a/source/Classroom/Basics/Account/teammates_faq.md b/source/Classroom/Basics/Account/teammates_faq.md deleted file mode 100644 index 7d070dc472..0000000000 --- a/source/Classroom/Basics/Account/teammates_faq.md +++ /dev/null @@ -1,148 +0,0 @@ ---- -seo: - title: Teammates FAQ - description: Frequently Asked Questions about SendGrid Teammates - keywords: faq, frequently, asked, questions, teammates, help -title: Teammates FAQ -weight: 0 -layout: page -navigation: - show: true ---- - -* [Is Teammates available for all SendGrid pricing plans?](#-Is-Teammates-available-for-all-SendGrid-pricing-plans) -* [Is there an additional fee to use Teammates?](#-Is-there-an-additional-fee-to-use-Teammates) -* [How are teammates different from subusers?](#-How-are-teammates-different-from-subusers) -* [How are teammates different from Multiple User Credentials?](#-How-are-teammates-different-from-Multiple-User-Credentials) -* [What will happen to my Multiple User Credentials?](#-What-will-happen-to-my-Multiple-User-Credentials) -* [Why can't my teammate impersonate a subuser?](#-Why-cant-my-teammate-impersonate-a-subuser) -* [Can I manage my teammates via API?](#-Can-I-manage-my-teammates-via-API) -* [Is there a difference between managing teammates in the API versus the Customer Portal?](#-Is-there-a-difference-between-managing-teammates-in-the-API-versus-the-Customer-Portal) -* [Can I recover a deleted teammate?](#-Can-I-recover-a-deleted-teammate) -* [How do I request access to a SendGrid feature?](#-How-do-I-request-access-to-a-SendGrid-feature) -* [How do I grant access to a SendGrid feature?](#-How-do-I-grant-access-to-a-SendGrid-feature) -* [How do I set up Two-Factor Authentication for a teammate?](#-How-do-I-set-up-TwoFactor-Authentication-for-a-teammate) - -{% anchor h2 %} -Is Teammates available for all SendGrid pricing plans? -{% endanchor %} - -**Essentials, [Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html), and Free Trial users may create up to one teammate per account. There is not a teammate limit for Pro and higher plans.** - -If you have an Essentials, [Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html), or Free Trial plan and have created more than one multiple credentialed user, all of those credentialed users [will be migrated to Teammates]({{root_url}}/Classroom/Basics/Account/teammates_faq.html#-What-will-happen-to-my-Multiple-User-Credentials). However you will not be able to create any additional teammates unless you [upgrade to the Pro plan or higher](https://sendgrid.com/pricing/). - -{% anchor h2 %} -Is there an additional fee to use Teammates? -{% endanchor %} - -There is no additional fee required to use Teammates. All you need is a SendGrid account. - -{% anchor h2 %} -How are teammates different from subusers? -{% endanchor %} - -While [subusers]({{root_url}}/User_Guide/Settings/Subusers/index.html) and [teammates]({{root_url}}/User_Guide/Settings/teammates.html) might immediately seem quite similar, there are a few notable differences. - -Most importantly, subusers have full access to all SendGrid features, except for billing. Teammates may have full access, but can be configured to have limited access. - -While teammates are available on all pricing plans, subusers are only available to Pro 100K accounts and up. For more information, please see our [Pricing Page](https://sendgrid.com/pricing/). - -Subusers are considered "child accounts" of a main SendGrid account. This means that while they share the overall credit pool, they have their own settings, statistics, and can be whitelabeled. For more information about subusers, please visit our [Classroom]({{root_url}}/Classroom/Basics/Account/what_are_subusers.html). - -On the other hand, teammates cannot be whitelabeled, they do contribute to the account's overall statistics, and they do share the same settings as the parent or subuser account under which they were created. - -Teammates is intended to be used by multiple members of the same team who belong to the same company, where each team member, or teammate, serves a specific role. Subusers are more commonly used by [OEM]({{root_url}}/Classroom/Basics/Misc/sendgrid_oem_process.html) companies, who provide email delivery as a service. - -{% info %} -Subusers can create and manage teammates. The parent account will have complete access to the settings of all subuser created teammates. -{% endinfo %} - -{% anchor h2 %} -How are teammates different from Multiple User Credentials? -{% endanchor %} - -Teammates is an updated and expanded feature set based on [Multiple User Credentials]({{root_url}}/User_Guide/Settings/credentials.html). - -Your multiple credentialed users can be edited and managed via Teammates. - -As with Multiple User Credentials, Teammates allows you to create and manage multiple users of a single account, with the ability to specify what areas of the account those users can access. - -Multiple User Credentials allows the account owner to set two different permissions: - -* **UI/API** - allowed the user to access the dashboard and make API calls -* **Mail** - allowed the user to send email - -On the other hand, Teammates provides much more granular control over the permissions that each individual teammate has. Teammates provides several preconfigured levels of [permissions]({{root_url}}/User_Guide/Settings/teammates.html#-Teammate-Permissions), based on common roles, or personas. When creating a teammate, you may either choose from one of these presets ("Developer", "Marketer", or "Accountant") or you can customize your own set of permissions for a teammate. - -{% anchor h2 %} -What will happen to my Multiple User Credentials? -{% endanchor %} - -Teammates is an updated and expanded feature set based on [Multiple User Credentials]({{root_url}}/User_Guide/Settings/credentials.html). If you have one or more multiple credentialed users on your account, they will be migrated to Teammates with their original permissions. However, once migrated, you will have much more granular control over those teammates' permissions. - -The process by which multiple user credentials are converted to teammates is as follows: - -* Credentialed users with **UI/API** and **Mail** permissions will be converted to admin teammates. -* Credentialed users with **Mail** permissions only will be converted to teammates with only the ability to send mail. -* Credentialed users with **UI/API** permissions only will be converted to teammates with the ability access the dashboard and the ability to make the same API calls they previously had access to. - -{% warning %} -Once a credentialed user with only **UI/API** access has been converted to a teammate, that user will no longer automatically get access to new features. However, they will still be able to request access to new features. -{% endwarning %} - -{% anchor h2 %} -Why can't my teammate impersonate a subuser? -{% endanchor %} - -Only **parent SendGrid accounts** and **administrator teammates** may impersonate subusers. A teammate with restricted permissions can not impersonate a subuser, and subusers cannot impersonate other subusers. - -Any Multiple User Credentials that have been migrated to teammates will have to be updated to possess full administrator permissions before they will be able to impersonate subusers. Any Multiple User Credentials that had only **UI/API** permissions will be unable to impersonate subusers as teammates until you update their permissions. - -{% anchor h2 %} -Can I manage my teammates via API? -{% endanchor %} - -Yes, there is an API that you can use to create and manage Teammates. For more information, please visit our [API Reference]({{root_url}}/API_Reference/Web_API_v3/teammates.html). - -{% anchor h2 %} -Is there a difference between managing teammates in the API versus the Customer Portal? -{% endanchor %} - -There is no inherent difference between creating or managing teammates via the API and the UI, with one exception. When you create a teammate with the API, you have more granular control over a teammate's permissions. - -This is due to the fact that the Teammates API makes use of [API Key permissions]({{root_url}}/Classroom/Basics/API/api_key_permissions.html), or scopes, when setting teammate permissions. **There is not a 1:1 relationship between the set of teammate permissions configurable via the UI and the set of API Key permissions.** - -For example, one permission displayed in the UI might be comprised of several API Key scopes. This list of scopes is much more detailed than the high level list of Teammate permissions presented in the UI, hence the increased granularity when editing a teammate's permissions via the API. - -{% anchor h2 %} -Can I recover a deleted teammate? -{% endanchor %} - -Deleted teammates may not be recovered. Once a teammate has been deleted, that teammate and its settings can never be restored. Assets created by the teammate, such as any templates, campaigns, contacts, or API keys, will **not** be deleted. - -{% anchor h2 %} -How do I request access to a SendGrid feature? -{% endanchor %} - -If you are a teammate with restricted access to a SendGrid account but feel that there is a feature you should have access to, simply navigate to that feature in the Customer Portal and click **Request Access**. You will receive an email when an account administrator either grants or denies you access. - -{% anchor h2 %} -How do I grant access to a SendGrid feature? -{% endanchor %} - -As an administrator, you can grant access to a feature several ways. If a teammate has requested access to a feature, simply log in to your account, navigate to **Settings** in the left hand sidebar, and click **Teammates**. You will see three tabs labeled **All**, **Requesting Access**, and **Invited**. Click **Requesting Access** to view a list of all Teammates who have requested access along with the name of the feature they requested access to. Select either **Deny** or **Approve**. - -You also can give feature access to a teammate by editing that Teammate's permissions settings. Simply navigate to the teammates overview, and find the teammate under the **All** tab. Click the Action Cog next to that teammate and click **Edit**. This will open a window allowing you to change that teammate's various permissions. For more information, please visit our [User Guide]({{root_url}}/User_Guide/Settings/teammates.html). - -{% anchor h2 %} -How do I set up Two-Factor Authentication for a teammate? -{% endanchor %} - -Each individual teammate is responsible for setting up Two-Factor Authentication on their account. The process of setting up Two-Factor Authentication as a Teammate is no different from the process for a regular account owner. For detailed instructions on how to configure Two-Factor Authentication, [click here]({{root_url}}/User_Guide/Settings/two_factor_authentication.html). - -{% anchor h2 %} -Related Resources -{% endanchor %} - -* [User Guide]({{root_url}}/User_Guide/Settings/teammates.html) -* [API Reference]({{root_url}}/API_Reference/Web_API_v3/teammates.html) diff --git a/source/Classroom/Basics/Account/what_are_subusers.md b/source/Classroom/Basics/Account/what_are_subusers.md deleted file mode 100644 index f6ece8a380..0000000000 --- a/source/Classroom/Basics/Account/what_are_subusers.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -seo: - title: What are Subusers? - description: What are Subusers? - keywords: segmentation, subuser, subaccount, account -title: What are Subusers? -weight: 0 -layout: page -zendesk_id: 200181918 -navigation: - show: true ---- - -Subusers are child accounts available for all Pro level and higher customers. Subusers share the same overall credit pool but have their own unique SMTP credentials, settings, statistics, and site login. Subusers can be Whitelabeled to separate sending domains by purchasing additional sending IPs for $30 per IP per month, creating a new Subuser assigned to the IP, and then completing the Whitelabel via the subuser management area of your account settings. - -There are three typical use cases for Subusers: - -1. Internal Use - Using Subusers to separate statistics or create accounts with different settings. - -2. External Use, Unwhitelabeled Sending - If you are creating a Subuser to send messages on behalf of a new domain, you can either send on behalf of your current Whitelabel or you can purchase a new IP to Whitelabel a new Subdomain. Creating a Subuser that uses the parent account IP and Whitelabel results in a ['via' or 'on behalf of' message]({{root_url}}/Classroom/Troubleshooting/Authentication/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.html) displaying in some email clients if you use a FROM domain that does not match the Whitelabeled domain. These settings can be adjusted in the Whitelabels section of your account settings. - -3. External Use, Whitelabeled Sending - To send on behalf of a different domain and have the messages fully Whitelabeled, you need to purchase a new sending IP and Whitelabel that IP to the new sending domain. - -Subusers are created and managed in the Subuser Management section of your account settings. diff --git a/source/Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.md b/source/Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.md deleted file mode 100644 index f525ccfac5..0000000000 --- a/source/Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -seo: - title: What is my sending/originating IP address with Sendgrid? - description: What is my sending/originating IP address with Sendgrid? - keywords: IP, dedicated, sending, IP, account, originating, originate, plan -title: What is my sending/originating IP address with Sendgrid? -weight: 0 -layout: page -navigation: - show: true ---- - -# Do I have a dedicated IP? - -Depending on the plan you have chosen, you either have a dedicated sending IP address or you are using a shared sending IP address. - -- All Pro and Premier customers are given at least one dedicated sending IP by default. You can view any IPs attached to your account [here](https://app.sendgrid.com/settings/ip_addresses). -- Free and Essential customers send from groups of shared IP addresses, where they are grouped with senders of similar reputation and deliverability. Shared IPs addresses that these accounts send from can change without notice as your reputation changes, or as we make changes to IP groups to improve deliverability. In theses cases, you will not be able to view your shared sending IP addresses from within your account. - -To see your dedicated IPs, you may [view them here](https://app.sendgrid.com/settings/ip_addresses). diff --git a/source/Classroom/Basics/Account/what_is_the_difference_between_subusers_and_multiple_credentials.md b/source/Classroom/Basics/Account/what_is_the_difference_between_subusers_and_multiple_credentials.md deleted file mode 100644 index 358a72c439..0000000000 --- a/source/Classroom/Basics/Account/what_is_the_difference_between_subusers_and_multiple_credentials.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -st: - published_at: 2016-06-03 - type: Classroom -seo: - title: What is the difference between subusers, teammates, and multiple credentials? - description: Learn the difference between subusers, teammates and multiple credentials... - keywords: subuser, multiple, credentials, team, mate, teammates -title: What is the difference between subusers and multiple credentials? -weight: 0 -layout: page -navigation: - show: true ---- - -## What is the difference between subusers and multiple credentials? - -If you are on a Pro plan or higher, you have access to create [subusers]({{root_url}}/Classroom/Basics/Account/what_are_subusers.html). Subusers act as standalone accounts that share the parent account’s credits. This allows for stats tracking that is specific to those subusers as well as unique credentials to access each subuser. This is useful for multiple integrations and is a great option to keep your transactional and marketing emails separate. To setup a subuser, navigate to the [Subuser Management](https://app.sendgrid.com/settings/subusers) page to get started. - -{% info %} -Each parent account is limited to 15 subusers. If you need to add more subusers, you can learn more about it [here]({{root_url}}/Classroom/Basics/Account/how_do_i_add_more_subusers_to_my_account.html). -{% endinfo %} - -Before the release of Teammates, **multiple credentials** made it possible to give others access to your primary account without having to disclose your primary credentials. This option was located under [Credentials](https://app.sendgrid.com/settings/credentials) within your Settings. Multiple credentials allowed the parent account to grant access to another team member or department to read stats, use the UI, and to send mail using the primary account. **Multiple Credentials has since been improved and updated, and is now referred to as Teammates.** - -## What is the difference between multiple credentials and teammates? - -As of February 2017, all multiple user credentials have been migrated to [teammmates]({{root_url}}/User_Guide/Settings/teammates.html). Teammates is simply an expanded and improved iteration of the multiple user credentials feature. Teammates allows for more granular control over individual teammates' permissions, in addition to improving the process of inviting teammates and requesting/granting access to various SendGrid features. To learn more about teammates, please read our [Teammates FAQ]() and [User Guide]({{root_url}}/User_Guide/Settings/teammates.html) - -## What is the difference between teammates and subusers? - -While [subusers]({{root_url}}/User_Guide/Settings/Subusers/index.html) and [teammates]({{root_url}}/User_Guide/Settings/teammates.html) might immediately seem quite similar, there are a few notable differences. - -Most importantly, subusers have full access to all SendGrid features, except for billing. Teammates may have full access, but can be configured to have limited access. - -While teammates are available on all pricing plans, subusers are only available to Pro 100K accounts and up. For more information, please see our [Pricing Page](https://sendgrid.com/pricing/). - -Subusers are considered "child accounts" of a main SendGrid account. This means that while they share the overall credit pool, they have their own settings, statistics, and can be whitelabeled. For more information about subusers, please visit our [Classroom]({{root_url}}/Classroom/Basics/Account/what_are_subusers.html). - -On the other hand, teammates cannot be whitelabeled, they do contribute to the account's overall statistics, and they do share the same settings as the parent or subuser account under which they were created. - -Teammates is intended to be used by multiple members of the same team who belong to the same company, where each team member, or teammate, serves a specific role. Subusers are more commonly used by [OEM]({{root_url}}/Classroom/Basics/Misc/sendgrid_oem_process.html) companies, who provide email delivery as a service. - -{% info %} -Subusers can create and manage teammates. The parent account will have complete access to the settings of all subuser created teammates. -{% endinfo %} diff --git a/source/Classroom/Basics/Account/why_am_i_seeing_credential_resource_already_exists_when_i_am_creating_a_subuser_or_credential.md b/source/Classroom/Basics/Account/why_am_i_seeing_credential_resource_already_exists_when_i_am_creating_a_subuser_or_credential.md deleted file mode 100644 index c8e85e2c26..0000000000 --- a/source/Classroom/Basics/Account/why_am_i_seeing_credential_resource_already_exists_when_i_am_creating_a_subuser_or_credential.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -st: - published_at: 2016-06-07 - type: Classroom -seo: - title: Why am I seeing “Credential Resource Already Exists” when I am creating a subuser or credential? - description: Having trouble creating a username... - keywords: username, crendential, subuser, exists, resource -title: Why am I seeing “Credential Resource Already Exists” when I am creating a subuser or credential? -weight: 0 -layout: page -navigation: - show: true ---- - -If you are seeing a message that states "Credential Resource Already Exists" when trying to create a new subuser or credential it is because the chosen username is already in use in the SendGrid user database. As it turns out, every username must be unique and not in use by any other SendGrid account. In order to successfully create a new subuser or credential after receiving this message, you will need to change the chosen username slightly by adding additional characters or choosing a new username. diff --git a/source/Classroom/Basics/Account/why_are_the_pro_plans_recommended_above_all_others.md b/source/Classroom/Basics/Account/why_are_the_pro_plans_recommended_above_all_others.md deleted file mode 100644 index 996e143e57..0000000000 --- a/source/Classroom/Basics/Account/why_are_the_pro_plans_recommended_above_all_others.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -seo: - title: Why are the Pro plans recommended above all others? - description: Why are the Pro plans recommended above all others? - keywords: -title: Why are the Pro plans recommended above all others? -weight: 0 -layout: page -zendesk_id: 205441048 -navigation: - show: true ---- - -The Pro plans come with all the features we offer. Free and Essential plans are designed to fulfill specific use cases, and as a result can lack some features you might need. - -One of the best reasons to go Pro is getting a dedicated IP address. Sending from a dedicated IP address allows you better control over your deliverability and sending reputation. - - - -For more info on what plans come with what features, check out our [Pricing page](https://sendgrid.com/pricing)! diff --git a/source/Classroom/Basics/Account/why_cant_I_reset_my_password_if_my_account_is_not_provisioned.md b/source/Classroom/Basics/Account/why_cant_I_reset_my_password_if_my_account_is_not_provisioned.md index 629bb77235..b7143ef65f 100644 --- a/source/Classroom/Basics/Account/why_cant_I_reset_my_password_if_my_account_is_not_provisioned.md +++ b/source/Classroom/Basics/Account/why_cant_I_reset_my_password_if_my_account_is_not_provisioned.md @@ -15,4 +15,4 @@ navigation: You will not be able to reset the password for an account where your email address has [not yet been confirmed]({{root_url}}/Classroom/Troubleshooting/Account_Administration/cant_log_in_to_your_account.html). However, you will also not be able confirm your email address and activate the account without knowing your account’s username and the password. So how do you move forward? -As it turns out, the only option would be to [create another account](https://sendgrid.com/pricing). Once the new account is created, please [reach out to support](http://support.sendgrid.com) and let us know what the new username is and what happened, so we can expedite the provisioning process for you. We can then make sure you are not turned down due to signing up for multiple accounts with the same information. Remember, you are only charged for paid accounts after you are sucessfully provisioned, so there is no need to worry when creating a new paid account to get around this scenario. +As it turns out, the only option would be to [create another account](https://sendgrid.com/pricing). Once the new account is created, please [reach out to support](http://support.sendgrid.com) and let us know what the new username is and what happened, so we can expedite the provisioning process for you. We can then make sure you are not turned down due to signing up for multiple accounts with the same information. Remember, you are only charged for paid accounts after you are successfully provisioned, so there is no need to worry when creating a new paid account to get around this scenario. diff --git "a/source/Classroom/Basics/Billing/Icon\r" "b/source/Classroom/Basics/Billing/Icon\r" deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/source/Classroom/Basics/Billing/alternate_payment_methods.md b/source/Classroom/Basics/Billing/alternate_payment_methods.md deleted file mode 100644 index e53dd16032..0000000000 --- a/source/Classroom/Basics/Billing/alternate_payment_methods.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -seo: - title: Alternate Payment Methods? - description: Alternate Payment Methods? - keywords: payment, pay, alternate, other, money, order, cash, with, invoicing, quarterly, check, annual, ahead, lump -title: Alternate Payment Methods? -weight: 0 -layout: page -zendesk_id: 203855396 -navigation: - show: true ---- - -Currently the only methods of payment we accept are **credit or check cards**. We also charge accounts on a **monthly basis**, we do not offer pre-payment, quarterly billing, or annual billing at this time. - -We don't accept PayPal, wire transfer, checks, or any card requiring a PIN. -Sorry for any inconvenience this may cause! diff --git a/source/Classroom/Basics/Billing/billing_info_and_faqs.md b/source/Classroom/Basics/Billing/billing_info_and_faqs.md deleted file mode 100644 index b2c767f2ce..0000000000 --- a/source/Classroom/Basics/Billing/billing_info_and_faqs.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -seo: - title: Billing Info and FAQs - description: Billing Info and FAQs - keywords: billing, refund, subscription, plan, charge, usage, overage, newsletter, marketing, campaigns, cancel, downgrade, upgrade, resubmit, retry, payment -title: Billing Info and FAQs -weight: 0 -layout: page -zendesk_id: 206259797 -navigation: - show: true ---- - -SendGrid charges every account on a month-to-month subscription basis, at the beginning of the month your credit card on file will be automatically charged in full for the following stuff: - -- The price of your current base plan. -- Any overages or usage charges from the previous month. -- Contact storage charges from the previous month, if applicable. -- Legacy Newsletter usage charges, if applicable. - - -# FAQS - -**How do I read my invoice?** - -Learn more about what you're paying for with our "[How to read your invoice]({{root_url}}/Classroom/Basics/Billing/how_to_read_your_invoice.html)" article. - - -**Do credits roll over?** - -Credits don't roll over from month to month, any unused credits from the previous month are lost when your subscription refreshes. So be sure you're on the [plan that is right for you](https://sendgrid.com/pricing)! - - -**I missed a payment, what happens next?** - -Accounts with outstanding balances over 4-5 days old will be suspended due to nonpayment. As soon as possible, [update your payment info or resubmit payment]({{root_url}}/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html) and your account will become active again shortly. - -Accounts that have unpaid invoices and are still suspended during the last week of the month will be terminated, and access revoked until the balance is settled. Please contact support to get your account re-activated from a billing terminated state. - - -**How does Marketing Campaigns billing work?** - -Glad you asked! [Read more about it here]({{root_url}}/Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.html). - - -**I received a Payment Failed message.** - -If you receive a _Payment Failed_ message, you can [update your credit card here]({{root_url}}/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html). You can update the expiration date on an existing card or enter a new card(please re-add the card information to update the expiry date). Also, if you now have sufficient funds on your current card, you can retry an outstanding charge. - - -**How do overages work?** - -Depending on your package, you will be charged a small amount per-email for each email that you send beyond the credit limit of your current package. Any overage charges are added to the invoice of the month _after_ the over-limit sending occurred. - -**Note: Upgrading your account does NOT absorb overage charges already incurred, so make sure you are using the right package for your usage case.** - -![]({{root_url}}/images/pricing_grid.png) - - -**What is this "Contact List Storage" item on my invoice?** - -You may see a "Contact List Storage" item on your monthly invoices. This only applies to customers who are using the online Marketing Campaigns feature set. Marketing Campaigns usage is charged at a rate determined by the number of contacts hosted by our service on your account. Your monthly invoice includes charges for contact list storage during the previous month. - -You will be billed $10 for every 10,000 contacts. Your first 2,000 contacts are stored for free. - - -**I would like to request a refund.** - -Learn more about your eligibility for a possible refund [here]({{root_url}}/Classroom/Basics/Billing/i_would_like_to_request_a_refund.html). - - -**Here are some handy billing resources:** - -[Plan and Billing Details](https://app.sendgrid.com/settings/billing) - View or update your Credit Card, and download and view your invoices. - -[SendGrid Pricing Page](http://sendgrid.com/pricing.html)- View the SendGrid plans along with their functionality and features. This also shows overage charges per package. - -[Upgrade your Account](https://app.sendgrid.com/settings/billing) - Upgrade your account to a higher level package, upgrades are effective immediately. - -[Downgrade your Account](https://app.sendgrid.com/settings/billing)- Downgrade your account to a lower level package, downgrades take effect on the first day of the next month. - -[Cancel your Account](https://app.sendgrid.com/settings/billing) - Cancel your SendGrid account, this brings your account back down to the Free level. diff --git a/source/Classroom/Basics/Billing/did_you_receive_a_billing_notification.md b/source/Classroom/Basics/Billing/did_you_receive_a_billing_notification.md deleted file mode 100644 index d1ba0d7b99..0000000000 --- a/source/Classroom/Basics/Billing/did_you_receive_a_billing_notification.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -seo: - title: Did You Receive A Billing Notification? - description: Did You Receive A Billing Notification? - keywords: invoice, billing, credit, card, payment, account -title: Did You Receive A Billing Notification? -weight: 0 -layout: page -zendesk_id: 200183058 -navigation: - show: true ---- - -If you received a billing email, it was because we were not able to process a payment on your account. - -There are several different reasons that your credit card may have been declined. To get this issue resolved, please log in and [resubmit payment here]({{root_url}}/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html). - - - -[**Read more here for information on how to get your card updated, deleted, or changed.**]({{root_url}}/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html) diff --git a/source/Classroom/Basics/Billing/forgot_to_cancel_or_upgrade.md b/source/Classroom/Basics/Billing/forgot_to_cancel_or_upgrade.md deleted file mode 100644 index 4b5633f61b..0000000000 --- a/source/Classroom/Basics/Billing/forgot_to_cancel_or_upgrade.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -seo: - title: Forgot to cancel or upgrade? - description: What to do if you forgot to cancel or upgrade your SendGrid account. - keywords: refund, charge, chargeback, payment, pay, charge, chargeback, forgot, cancel, upgrade, accidentally -title: Forgot to cancel or upgrade? -weight: 0 -layout: page -navigation: - show: true ---- -If you have not used your account in the current calendar month, we may be able to issue a refund or partial refund if you forgot to downgrade or cancel your account in the prior month. For more information on refund eligibility, [click here.]({{root_url}}/Classroom/Basics/Billing/i_would_like_to_request_a_refund.html) - -Refunds for forgotten cancellation/downgrade are only applicable to the subscription charge on your account, not for overages or contact storage charges accrued during the prior month. - -EXAMPLE: - -If you request a refund on your $79.95/mo Pro account, and your monthly invoice totals $117.00 due to a combination of overages and contact storage, you are only eligible for a refund of up to 79.95. The remaining 37.05 cannot be refunded in this scenario. diff --git a/source/Classroom/Basics/Billing/how_do_i_upgrade_or_downgrade_my_account.md b/source/Classroom/Basics/Billing/how_do_i_upgrade_or_downgrade_my_account.md deleted file mode 100644 index ba6113532c..0000000000 --- a/source/Classroom/Basics/Billing/how_do_i_upgrade_or_downgrade_my_account.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -seo: - title: How do I Upgrade or Downgrade my account? - description: How do I Upgrade or Downgrade my account? - keywords: -title: How do I Upgrade or Downgrade my account? -weight: 0 -layout: page -zendesk_id: 205493978 -navigation: - show: true ---- - -[Upgrade your Account](https://app.sendgrid.com/settings/billing) - Upgrade your account to a higher level package, upgrades are effective immediately. - -[Downgrade your Account](https://app.sendgrid.com/settings/billing) - Downgrade your account to a lower level package, downgrades take effect on the first day of the next month. - -![]({{root_url}}/images/pricing_grid.png) diff --git a/source/Classroom/Basics/Billing/how_does_billing_work_for_legacy_newsletter.md b/source/Classroom/Basics/Billing/how_does_billing_work_for_legacy_newsletter.md deleted file mode 100644 index fbec193034..0000000000 --- a/source/Classroom/Basics/Billing/how_does_billing_work_for_legacy_newsletter.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -st: - published_at: 2016-05-03 - type: Classroom -seo: - title: How does billing work for Legacy Newsletter? - description: Learn about the usage based pricing of Legacy Newsletter. - keywords: legacy, newsletter, billing, charge, overage, service -title: How does billing work for Legacy Newsletter? -weight: 0 -layout: page -navigation: - show: true ---- - -Legacy Newsletter usage is charged at a rate of **$0.25 per 1000 messages** that are sent using either the Legacy Newsletter UI or API suite. This charge is in addition to normal monthly plan charges and any overage charges you may incur from the previous month. - - - -If you find yourself being charged for using both Legacy Newsletter and Marketing Campaigns, consider one of the following options: - -**1.** (Recommended) Move your marketing email over to our Marketing Campaigns platform. This removes the per email usage fee that you incur when using Legacy Newsletter, and instead uses a contact storage based pricing model. - -**2.** Continue to use the Legacy Newsletter, and delete your contacts you have stored in Marketing Campaigns. This removes the per/10k storage charge from the equation. Please keep in mind when choosing this option that **Legacy Newsletter will eventually be deprecated**. - -_Please note that lists, content, and features ARE NOT SHARED between Legacy Newsletter and Marketing Campaigns, so you will need to settle on using one feature set or the other if you wish to avoid being billed for both._ diff --git a/source/Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.md b/source/Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.md deleted file mode 100644 index 052912de69..0000000000 --- a/source/Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: How does billing work for Marketing Campaigns? -weight: 0 -layout: page -navigation: - show: true -seo: - title: How does billing work for Marketing Campaigns? - description: How does billing work for Marketing Campaigns? - keywords: marketing, campaigns, bill, charge, contacts, usage, overage, subuser ---- - -{% anchor h2 %} -Overview -{% endanchor %} - -Each email sent via Marketing Campaigns (UI or API) will count towards your monthly plan volume, just like the messages you already send. - -In addition to your monthly plan price, you will receive a separate charge based on the maximum size of your Contacts list, which is calculated based on this simple formula: - -**$10.00 per 10,000 stored contacts per month.** - -This amount is based on the highest number stored in the preceding month. Think of it as a high-water mark, so even if you reduce your contacts before your next bill rolls around (the 1st of each calendar month), you'll still be charged for whatever upper limit was reached. - -For all customers, the first 2,000 contacts are stored for free. Free customers are also welcome to try out Marketing Campaigns, but will be able to upload no more than 2,000 Contacts. - -Example: - -If you have a Pro 100,000 plan ($79.95/month) who has uploaded 22,000 contacts to Marketing Campaigns ($20/month), will see a total bill for $99.95/month. - -High volume pricing is also available, contact our Sales department at [](mailto:sales@sendgrid.com) for more details. - -![]({{root_url}}/images/pricing_grid.png) - -{% anchor h2 %} -How will I be billed? -{% endanchor %} - -You will see the "Contact List Usage" charge added to your monthly bill reflecting your maximum Contacts list size for the preceding month. Additionally, each email sent via the new features will count as a credit toward your monthly plan volume. - -Be sure to visit our [pricing page](https://sendgrid.com/pricing) for more information on how our pricing works. - -{% anchor h2 %} -Marketing Campaigns Billing for Subusers -{% endanchor %} - -Each subuser may store up to 2,000 contacts for free before they are charged the same rate of $10.00 per 10,000 contacts each month. Any additional charges due for storing contacts on a subuser account will appear in the parent account's monthly invoice. - -The emails subusers send through Marketing Campaigns are subtracted from the parent account's monthly email credit allowance. - -**Note:** Your parent account will be billed for each unique contact, regardless of how many lists or segments that contact appears on. However, if there are one or more subusers under a parent account, the parent account will be billed for all unique contacts stored on each account, even if the same contact is stored on multiple accounts. - -For example, if a SendGrid parent account uploads a contact with the address `johndoe@example.com` and a single subuser of that parent account also uploads a contact for `johndoe@example.com`, then the parent account will be billed twice for that contact. diff --git a/source/Classroom/Basics/Billing/how_does_overage_pricing_work.md b/source/Classroom/Basics/Billing/how_does_overage_pricing_work.md deleted file mode 100644 index 92b5c93a02..0000000000 --- a/source/Classroom/Basics/Billing/how_does_overage_pricing_work.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -seo: - title: How does overage pricing work? - description: How does overage pricing work? - keywords: credit, pricing, package, overage -title: How does overage pricing work? -weight: 0 -layout: page -zendesk_id: 205012777 -navigation: - show: true ---- - -There’s an overage charge per email that changes depending on the package. This overage charge comes into play when you start to send emails beyond your monthly subscription amount. - -You can see the cost for overages on the [Pricing page](https://sendgrid.com/transactional-email/pricing) for each package. diff --git a/source/Classroom/Basics/Billing/how_to_read_your_invoice.md b/source/Classroom/Basics/Billing/how_to_read_your_invoice.md deleted file mode 100644 index 4c541972d4..0000000000 --- a/source/Classroom/Basics/Billing/how_to_read_your_invoice.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -seo: - title: Reading your invoice - description: Reading your invoice - keywords: invoice, bill, receipt, refund, line, item, marketing, campaigns, charge, contacts, usage, overage -title: Reading your invoice -weight: 0 -layout: page -zendesk_id: -navigation: - show: true ---- - -Your SendGrid invoice contains a lot of information, which may be difficult to read, particularly if you've made changes to your account during the previous month. Here's information on how to read your invoice: - -![]({{root_url}}/images/invoice_legend.png) - -{% anchor h2 %} -1. Physical Address -{% endanchor %} - -**The physical address of your business.** This address is the same address you entered when you first signed up. If you would like to update the address as it appears on your invoices, click Change Invoice Address on the [Plan & Billing Details](https://app.sendgrid.com/settings/billing) page. If you need to change the address on an existing invoice, please send an email to [billing@sendgrid.com](mailto:billing@sendgrid.com). - - - -{% anchor h2 %} -2. Billing Email -{% endanchor %} - -**The email address where you receive SendGrid statements.** By default, this is the primary email address on file in your account. You can update it anytime from the [Plan & Billing Details](https://app.sendgrid.com/settings/billing) page. If you override the billing email address in this way, the primary email address on file will stop receiving invoices. - -Need to send invoices to multiple addresses? Consider creating a [role address](https://sendgrid.com/docs/Classroom/Deliver/Address_Lists/role_addresses.html) on your side that includes the all of billing stakeholders in your organization, or send an email to [billing@sendgrid.com](mailto:billing@sendgrid.com). - -{% anchor h2 %} -3. Charge Summary -{% endanchor %} - -These are the total charges for services used **in the current and previous month**: - -![]({{root_url}}/images/invoice_NL_usage.png) - -This describes the plan you subscribe to and the total charge for usage in the previous month. In this case, the user switched from the Essentials plan to the Pro plan in the middle of the previous month, and the charge reflects a credit for the part of the month they weren't on Essentials and a charge for the part of the month where they switched to Pro. - -![]({{root_url}}/images/invoice_IP_Address.png) - -**IP Address** - These charges indicate that you have additional IP Addresses allocated to your account. There are two lines because one IP Address was added before the IP Addresses price increased, and other was added after. - -Additional IPs cost $30.00 per IP/per month for Pro 100k plans and above. - -For more information on Sendgrid Plans, visit our [pricing page](https://sendgrid.com/pricing). - - - -![]({{root_url}}/images/invoice_contact_1.png) - -**Contact List Storage** - This item is the charge for the highest number of stored Marketing Campaigns Contacts in the previous month. - -Refer to "Contact List Usage" in the Usage Summary section below for more information on how this charge is calculated. - -{% anchor h2 %} -4. Usage Summary -{% endanchor %} - -This is how charges from the Usage Summary section are calculated: - -![]({{root_url}}/images/invoice_overage.png) - -*This item is a calculation of any email credits used that go over the monthly limit of you package for sending **during the previous month.** - -In this example; the Pro 100k allows for 100,00 emails to be sent per month. We see that for the prior month, 120,000 email were sent, for a total of 20,000 emails over the limit. - -The overage charge rate for the Pro 100k plan is $0.00085 per extra email(20,000), which works out to a $17.00 overage charge. - - -![]({{root_url}}/images/invoice_contact_storage.png) - -**Contact List Usage** - This item refers to highest number of **stored Marketing Campaigns Contacts in the previous month.** For more detailed breakdown on how Contact Storage billing works in Marketing Campaigns, [click here]({{root_url}}/Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.html). - -In this example, the number under the "Used" column refers to the number of "blocks" of 10,000 contacts being stored in the prior month. We see that the highest number of blocks stored in that month was 5, or 50,000 contacts. - -The charge for contact storage is **$10.00 PER 10,000 contacts(1 block),** so this example works out to a $0.00 usage charge for contacts stored in the previous month. - -![]({{root_url}}/images/invoice_usage_NL.png) - -**Newsletter Usage** - Legacy Newsletter usage is charged at a rate of **$0.25 per 1000 messages sent.** This charge is in addition to the base plan price for emails used, as well as any overages that are accrued. - -In this example, no messages were sent using the Legacy Newsletter, which works out to a $0.00 charge. - -{% anchor h2 %} -5. Transaction and Payment Summary -{% endanchor %} - -![]({{root_url}}/images/invoice_payment_summary.png) - -The Transaction Summary shows the total charges for the month, and the Payment Summary area shows the payment type, and last 4 digits of the card that was charged. For more information about updating your payment method, [click here](https://sendgrid.com/docs/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html). - -***These line items always reflect the plan you currently have, not necessarily "Pro 100k", which is shown for the purposes of demonstration.** diff --git a/source/Classroom/Basics/Billing/i_would_like_to_request_a_refund.md b/source/Classroom/Basics/Billing/i_would_like_to_request_a_refund.md deleted file mode 100644 index 653e9808af..0000000000 --- a/source/Classroom/Basics/Billing/i_would_like_to_request_a_refund.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -seo: - title: I would like to request a refund. - description: I would like to request a refund. - keywords: refund, charge, chargeback, payment, pay, charge, chargeback, forgot, cancel, accidentally -title: I would like to request a refund. -weight: 0 -layout: page -zendesk_id: -navigation: - show: true ---- - You must meet both criteria below in order for a refund to be considered: - -**You have not used your account in the current calendar month** - -Sendgrid packages operate off of a monthly subscription model, not direct usage. We will not issue a refund if you have used your account in the same calendar month as your request. Instead please cancel your account to avoid any future subscription charges. - -EXAMPLE: - -If you request a refund on the 5th of the month, but have used your account on any of the previous days in that month (1st - 5th), we cannot issue a refund. - -Alternatively, if you request a refund on the 5th of the month, and we can see that your account was not used during the current month, we can begin the discussion of issuing a refund. - -Please note; Refunds are only applicable to the subscription charge on your account, not for overages accrued during the prior month or contact storage charges. - -Did you forget to downgrade or cancel your account? [Click here for more info]({{root_url}}/Classroom/Basics/Billing/forgot_to_cancel_or_upgrade.html). - - - ![]({{root_url}}/images/pricing_grid.png) - - -**You have no overages and/or have no contacts stored in Marketing Campaigns** - -Refunds are only applicable to the subscription charge on your account, not for overage or contact storage charges from the prior month. We hold our customers responsible for managing their account credit limits and contact storage. - -EXAMPLE: - -If you request a refund on your $79.95/mo Pro account, and your monthly invoice totals $117.00 due to a combination of overages and contact storage, you are only eligible for a refund of up to 79.95.The remaining 37.05 cannot be refunded in this scenario. - - -For more information on how overages are calculated, please refer to the above graphic, or visit our [pricing page](https://sendgrid.com/pricing). - -For information on how contact storage in Marketing Campaigns is calculated, [click here]({{root_url}}/Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.html). - -Did you forget to downgrade or cancel your account? [Click here for more info]({{root_url}}/Classroom/Basics/Billing/forgot_to_cancel_or_upgrade.html). - - - -If you meet all of above conditions, please respond directly to the invoice email you have received, or email [billing@sendgrid.com](mailto:billing@sendgrid.com) to begin the discussion about a possible refund. - - diff --git a/source/Classroom/Basics/Billing/index.html b/source/Classroom/Basics/Billing/index.html deleted file mode 100644 index 7774956113..0000000000 --- a/source/Classroom/Basics/Billing/index.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -st: - published_at: 2016-12-13 - type: Classroom -seo: - title: Billing Overview - description: A collection of documentation covering billing, payment, and the different SendGrid plans. - keywords: billing, payment, credit, upgrade, downgrade, overages, PCI complient -title: Billing Overview -weight: 0 -layout: page -navigation: - show: true ---- - -{% anchor h2 %} -Billing Basics -{% endanchor %} - -

      - General documentation explaining how to read your invoice and a discussion of the various billing settings that can be modified from the UI. -

      - - - -{% anchor h2 %} -Billing FAQs -{% endanchor %} - -

      - Answers to some common questions about billing, payment, overages, and email credit usage. -

      - - - -{% anchor h2 %} -Marketing Email Billing -{% endanchor %} - -

      - SendGrid currently offers two marketing email solutions: the Legacy Newsletter and Marketing Campaigns. Here you will find an explanation of how billing is structured for each solution. -

      - - - -{% anchor h2 %} -Paying Your Bill -{% endanchor %} - -

      - Documentation covering the different ways that you can pay your bill, how to request a refund, and how to update your billing information. -

      - - - -{% anchor h2 %} -Plan Levels -{% endanchor %} - -

      - SendGrid offeres several different pricing plans. Here are a few articles related to upagrading and downgrading beetween different plans. For a detailed breakdown of the different plans, please visit our pricing page. -

      - - diff --git a/source/Classroom/Basics/Billing/is_your_account_billing_frozen.md b/source/Classroom/Basics/Billing/is_your_account_billing_frozen.md deleted file mode 100644 index a94394796e..0000000000 --- a/source/Classroom/Basics/Billing/is_your_account_billing_frozen.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -st: - published_at: 2016-05-25 - type: Classroom -seo: - title: Is your account in a Billing Frozen state? - description: Unable to send near the beginning of the month? Your account may be billing frozen... - keywords: send, can't, unable, frozen, blocked, locked, unblock, freeze, retry, rerun, charge, payment, missed -title: Is your account in a Billing Frozen state? -weight: 0 -layout: page -navigation: - show: true ---- - -If you find your account suddenly unable to send mail within the first week of the month, your account could be in a billing frozen state. This occurs when the card on file for your account is declined when we attempted to process payment on the first of the month. - -To reactivate your account please [update your credit card]({{root_url}}/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html) on file by logging into your SendGrid dashboard and going to [Settings > Plan and Billing Details > Change Billing Info](https://app.sendgrid.com/settings/billing). You can then change or re-enter the card information and then click Save. Once you update the card on file, the payment will process automatically and the account will be unfrozen. diff --git a/source/Classroom/Basics/Billing/is_your_account_billing_warned.md b/source/Classroom/Basics/Billing/is_your_account_billing_warned.md deleted file mode 100644 index 34f1cad9b5..0000000000 --- a/source/Classroom/Basics/Billing/is_your_account_billing_warned.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -seo: - title: Is your account billing warned? - description: Did you receive a notification regarding being billing warned? Learn more here... - keywords: warn, warned, warning, frozen, billing, refund, past, due, subscription, plan, charge, balance, usage, overage, contacts, storage, cancel, downgrade, upgrade, resubmit, retry, payment -title: Is your account billing warned? -weight: 0 -layout: page -zendesk_id: 206259797 -navigation: - show: true ---- - -{% info %} "You have unpaid invoices. Please update your payment details or retry payment." {% endinfo %} - -Did you receive a notification regarding an unpaid invoice? This is just a friendly warning that your service may be inturupted unless you settle any outstanding balance on your account. This may occur when the card on file for your account is declined when we attempted to process payment on the first of the month. - -To please [update your credit card or retry a payment]({{root_url}}/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html) by logging into your SendGrid account and visiting [Plan and Billing Details](https://app.sendgrid.com/settings/billing). You can then either re-enter the credit card information and then click Save, or retry the payment. If you choose to update the card on file, the outstanding payment will process automatically. diff --git a/source/Classroom/Basics/Billing/legacy_lite_plan.md b/source/Classroom/Basics/Billing/legacy_lite_plan.md deleted file mode 100644 index 0771e0ea4e..0000000000 --- a/source/Classroom/Basics/Billing/legacy_lite_plan.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -seo: - title: Legacy Lite Plan - description: - keywords: billing, lite, plan, legacy -title: Legacy Lite Plan -weight: 0 -layout: page -navigation: - show: true ---- - -{% warning %} -The Lite plan was discontinued for all new customers effective March 31, 2016. It is no longer available for new accounts. We intend to keep the plan available to current customers (who signed up for the Lite plan before March 31, 2016) for the foreseeable future, but continue to reserve the right to terminate the plan for all customers. The plan is now called the "Legacy Lite plan." -{% endwarning %} diff --git a/source/Classroom/Basics/Billing/lite_account_minimum_charge.md b/source/Classroom/Basics/Billing/lite_account_minimum_charge.md deleted file mode 100644 index d972617a2d..0000000000 --- a/source/Classroom/Basics/Billing/lite_account_minimum_charge.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -seo: - title: Legacy Lite Account - $1 Minimum Charge - description: Lite Account - $1 Minimum Charge - keywords: billing, lite, cost, plan -title: Legacy Lite Account - $1 Minimum Charge -weight: 0 -layout: page -zendesk_id: 200183088 -navigation: - show: true ---- -{% warning %} -The Lite plan was discontinued for all new customers effective March 31, 2016. [Click here]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html) for more information. -{% endwarning %} - -The Legacy Lite package has a minimum charge of $1/month. This policy change took effect for new accounts starting in June. The charge was implemented for existing accounts starting in August, but due to billing issues the August charge did not appear until this month. - -For all Legacy Lite accounts, you will see a $1 minimum monthly charge going forward. An email notice was sent to all Legacy Lite customers, notifying you of the change. - -However, we know that communications like this are easy to miss. If you wish to have your account converted to a Free account (limit of 400 emails per day), and the $2 charge refunded, please contact support and we’ll make the change to your account. diff --git a/source/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.md b/source/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.md deleted file mode 100644 index 9af4282aa6..0000000000 --- a/source/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -seo: - title: Update your Credit Card & Resubmit Payments - description: Update your Credit Card & Resubmit Payments - keywords: -title: Update your Credit Card & Resubmit Payments -weight: 0 -layout: page -zendesk_id: 205462488 -navigation: - show: true ---- - -Is your credit card about to expire? Need to move over from your personal/testing card to the corporate one? Maybe you just need to have our system process a payment on the current card, now that it's funded. All of these issues can be handled on the **[Plan and Billing Details](https://app.sendgrid.com/settings/billing) **page! - -![]({{root_url}}/images/billing.gif) - - - -You can update your card information, retry a failed payment, and export past invoices for your business on the Plan and Billing Details page. It is also possible to change your package type and cancel your account from this page. - - - -![]({{root_url}}/images/pricing_grid.png) - - diff --git a/source/Classroom/Basics/Billing/upgrade_partner_service b/source/Classroom/Basics/Billing/upgrade_partner_service deleted file mode 100644 index 299639d72f..0000000000 --- a/source/Classroom/Basics/Billing/upgrade_partner_service +++ /dev/null @@ -1,25 +0,0 @@ -v — -st: - published_at: 2016-05-26 - type: Classroom -seo: - title: How do I upgrade my account if I am using SendGrid through a partner service? - description: Need to upgrade your SendGrid account? - keywords: upgrade, account, third, party, service, Azure, Heroku, KKE, Google, Softlayer, AppDirect -title: How do I upgrade my account if I am using SendGrid through a parter service? -weight: 0 -layout: page -navigation: - show: true ---- - -If you wish to upgrade an account purchased through one of our third party partners, you must upgrade your SendGrid service through the partner service and not through the SendGrid site or interface. - -SendGrid cannot directly upgrade accounts created through:: -* [AppDirect](https://marketplace.appdirect.com/apps/1967#!overview) -* [Google Cloud Platform](https://sendgrid.com/partners/google/) -* [Heroku](https://elements.heroku.com/addons/sendgrid) -* [IBM BlueMix](https://console.ng.bluemix.net/catalog/services/sendgrid) -* [KKE](https://sendgrid.kke.co.jp/) -* [Microsoft Azure](https://azure.microsoft.com/en-us/marketplace/partners/sendgrid/sendgrid/) -* [SoftLayer](http://www.softlayer.com/email-delivery) diff --git a/source/Classroom/Basics/Billing/when_do_credits_reset.md b/source/Classroom/Basics/Billing/when_do_credits_reset.md deleted file mode 100644 index 45c572abd3..0000000000 --- a/source/Classroom/Basics/Billing/when_do_credits_reset.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -seo: - title: When do credits reset? - description: When do credits reset? - keywords: reset, email, time, package, credits, overage, refresh, roll, over, rollover, day, month -title: When do credits reset? -weight: 0 -layout: page -zendesk_id: 204234023 -navigation: - show: true ---- - -Free, Essentials, Pro, and Premier accounts will see their email credits reset the _1st day of each month_ at 12:01 PST. - -[Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html) accounts will see their credits reset _daily_ at 12:01 PST. diff --git a/source/Classroom/Basics/Billing/where_can_i_find_my_invoices.md b/source/Classroom/Basics/Billing/where_can_i_find_my_invoices.md deleted file mode 100644 index 90b00c46c1..0000000000 --- a/source/Classroom/Basics/Billing/where_can_i_find_my_invoices.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -seo: - title: Where can I find my Invoices? - description: Where can I find my Invoices? - keywords: -title: Where can I find my Invoices? -weight: 0 -layout: page -zendesk_id: 206260097 -navigation: - show: true ---- - -Head on over to your [Plan & Billing details](https://app.sendgrid.com/settings/billing) page and feast your eyes on your invoices of the past and present. - -From here, you can download and view your invoices to your heart's content. If you have questions about your invoice, please consult our handy "[How to read your invoice](https://sendgrid.com/docs/Classroom/Basics/Billing/how_to_read_your_invoice.html)" guide! diff --git a/source/Classroom/Basics/Email_Infrastructure/does_sendgrid_support_end_to_end_tls.md b/source/Classroom/Basics/Email_Infrastructure/does_sendgrid_support_end_to_end_tls.md index 829afc2a10..2cbe7a3796 100644 --- a/source/Classroom/Basics/Email_Infrastructure/does_sendgrid_support_end_to_end_tls.md +++ b/source/Classroom/Basics/Email_Infrastructure/does_sendgrid_support_end_to_end_tls.md @@ -11,6 +11,6 @@ navigation: show: true --- -By default, our system is designed to opportunistically try outbound TLS when attempting to deliver email. This means that if your recipient's email server accepts an inbound TLS connection, we will deliver the email over a TLS encrypted connection. If the server does not support TLS, we will deliver the message over the default unencrypted connection. Check out the [SMTP Ports guide](https://sendgrid.com/docs/Classroom/Basics/Email_Infrastructure/smtp_ports.html) for more information on _opportunistic TLS_. +By default, our system is designed to opportunistically try outbound TLS v.1.1 when attempting to deliver email. This means that if your recipient's email server accepts an inbound TLS v.1.1 connection, we will deliver the email over a TLS encrypted connection. If the server does not support TLS, we will deliver the message over the default unencrypted connection. -We also offer the ability to _enforce TLS encryption_ when we attempt to deliver email to your recipients. The [Enforced TLS feature](https://sendgrid.com/docs/API_Reference/Web_API_v3/Settings/enforced_tls.html) specifies whether or not the recipient is required to support TLS or have a valid certificate before we deliver an email to them. +We also offer the ability to _enforce TLS encryption_ when we attempt to deliver email to your recipients. The [Enforced TLS feature](https://sendgrid.com/docs/API_Reference/Web_API_v3/Settings/enforced_tls.html) specifies whether or not the recipient is required to support TLS v.1.1 or higher or have a valid certificate before we deliver an email to them. diff --git a/source/Classroom/Basics/Email_Infrastructure/email_flow.md b/source/Classroom/Basics/Email_Infrastructure/email_flow.md index 816b0b1ea9..682c0c8460 100644 --- a/source/Classroom/Basics/Email_Infrastructure/email_flow.md +++ b/source/Classroom/Basics/Email_Infrastructure/email_flow.md @@ -20,13 +20,13 @@ In the email flowchart below, you can see the main components that all email mes First, a sender puts together the content that their recipients will love. Then it’s time for the “SMTP conversation” to take place. SMTP stands for Simple Mail Transfer Protocol, and this conversation is what makes email messages get from the sender to the recipient. It’s easiest to think of an SMTP conversation as a “handshake.” -Imagine that a sender is a host at a party and all of the other guests are the recipients of the message. The host will then shake every guest’s hand and during that “handshake” they will have this SMTP conversation. In the end, the guest (i.e. recipient and its recipient server) will determine if they will accept the message or not. In this scenario, you can think of SendGrid as a person at the party grabbing both the host’s and guest’s hands and making the handshake and discussion actually happen. +Imagine that a sender is a host at a party and all of the other guests are the recipients of the message. The host will then shake every guest’s hand and during that “handshake” they will have this SMTP conversation. In the end, the guest (i.e. recipient and its recipient server) will determine if they will accept the message or not. In this scenario, you can think of SendGrid as a person at the party grabbing both the host’s and guest’s hands and making the handshake and discussion actually happen. {% anchor h2 %} The “Handshake” Details and Results {% endanchor %} -The sender connects to the SMTP server through SendGrid and tells the server the final destination it would like its message to go to. Let’s say it is person@customer.com. The SMTP server recognizes the domain portion (the part after the @ sign) of “customer.com” and contacts the receiving server responsible for accepting messages for that domain. During this connection the two servers exchange multiple pieces of information. The receiving server typically then says one of the following: +The sender connects to the SMTP server through SendGrid and tells the server the final destination it would like its message to go to. Let’s say it is example@example.com. The SMTP server recognizes the domain portion (the part after the @ sign) of “customer.com” and contacts the receiving server responsible for accepting messages for that domain. During this connection the two servers exchange multiple pieces of information. The receiving server typically then says one of the following: * “Yes, I know who ‘person’ is and all is in order to deliver it to their inbox.” * “Yes, I know who ‘person’ is and all is in order to deliver the message but not to the inbox.” @@ -47,14 +47,14 @@ This stands for “Domain Name System” and it is thought of as the “phone bo {% anchor h3 %} Authentication {% endanchor %} -The receiving server will check to see if there is an SPF (Sender Policy Framework) record in place (to see if the mail is coming from an IP authorized by that domain's administrators) if there is a DKIM (DomainKeys Identified Mail) record in place (to see if the message was tampered with in transit by someone other than the sender) and if there is a DMARC (Domain-based Mail Authentication Reporting and Conformance) record in place (this tells the receiving server where to place the mail based on the results of the SPF and DKIM authentication). SendGrid’s whitelabel feature assists with setting up both SPF and DKIM properly. This assists the the host (Sender) in being more recognizable and for the guest (recipient) and their mailbox provider to more easily trust the content attempting to be shared during the conversation. +The receiving server will check to see if there is an SPF (Sender Policy Framework) record in place (to see if the mail is coming from an IP authorized by that domain's administrators) if there is a DKIM (DomainKeys Identified Mail) record in place (to see if the message was tampered with in transit by someone other than the sender) and if there is a DMARC (Domain-based Mail Authentication Reporting and Conformance) record in place (this tells the receiving server where to place the mail based on the results of the SPF and DKIM authentication). SendGrid’s sender authentication feature assists with setting up both SPF and DKIM properly. This assists the the host (Sender) in being more recognizable and for the guest (recipient) and their mailbox provider to more easily trust the content attempting to be shared during the conversation. {% anchor h3 %} Reputation {% endanchor %} When reviewing the sending IP and domain, the receiving server will factor in both of the following items: -The reaction of its other recipients to mail sent by that same IP and domain (i.e. marked as spam or not). +The reaction of its other recipients to mail sent by that same IP and domain (i.e. marked as spam or not). Where the receiving server previously decided to place any mail from the same IP and domain. {% info %} @@ -74,4 +74,4 @@ Reacting to Opinions of the “Guests” {% anchor h3 %} Feedback for the Guests to Give the Host {% endanchor %} -Within email, there is a function known as a Feedback Loop. These are created by the mailbox providers and a Sender can get set up to receive notification through them to inform them when a recipient complains about the Sender’s message (aka, marking a message as junk or spam). This should help the host (Sender) to be aware of when certain guests didn’t prefer the content included in their interaction and the host (Sender) should not try to have another conversation (aka send a message) to this guest in the future. +Within email, there is a function known as a Feedback Loop. These are created by the mailbox providers and a Sender can get set up to receive notification through them to inform them when a recipient complains about the Sender’s message (aka, marking a message as junk or spam). This should help the host (Sender) to be aware of when certain guests didn’t prefer the content included in their interaction and the host (Sender) should not try to have another conversation (aka send a message) to this guest in the future. diff --git a/source/Classroom/Basics/Email_Infrastructure/everything_about_dmarc.md b/source/Classroom/Basics/Email_Infrastructure/everything_about_dmarc.md index c72aae0147..6b3db81d38 100644 --- a/source/Classroom/Basics/Email_Infrastructure/everything_about_dmarc.md +++ b/source/Classroom/Basics/Email_Infrastructure/everything_about_dmarc.md @@ -20,34 +20,33 @@ Enter DMARC, "Domain-based Message Authentication, Reporting & Conformance". Whi # How do I implement it? -Deploying DMARC for your email systems is a powerful way to help prevent malicious entities from potentially spoofing or otherwise tarnishing your good name. DMARC isn't for everyone, if you own a small domain, you're probably ok without it. If you have ever had problems with phishing in the past, or have a business that is financial oriented in nature, It might be right for you. +Deploying DMARC for your email systems is a powerful way to help prevent malicious entities from potentially spoofing or otherwise tarnishing your good name. DMARC isn't for everyone, if you own a small domain, you're probably ok without it. If you have ever had problems with phishing in the past, or have a business that is financial oriented in nature, It might be right for you. -DMARC, in conjunction with a dedicated IP (included in Pro or higher accounts) is a great start to getting industry-supported piece of mind. The DMARC aggregate and forensic reports are designed to be machine readable, and can be difficult for humans to make sense of. You will also need to utilize a DMARC report monitoring service to collect the reports and present the information in a meaningful way that leads to actionable insights. +DMARC, in conjunction with a dedicated IP (included in Pro or higher accounts) is a great start to getting industry-supported piece of mind. The DMARC aggregate and forensic reports are designed to be machine readable, and can be difficult for humans to make sense of. You will also need to utilize a DMARC report monitoring service to collect the reports and present the information in a meaningful way that leads to actionable insights. Return Path's Brand Monitor is one, and Agari is another. # The five phases: -1. Deploy DKIM & SPF by Whitelabeling your Sendgrid IP. -2. Ensure proper DKIM and SPF signing for your Whitelabel domain. +1. Deploy DKIM & SPF by setting up reverse DNS for your SendGrid IP. +2. Ensure proper DKIM and SPF signing for your authenticated domain. 3. Publish a DMARC record with your DNS registrar, then monitor the results. 4. Analyze the feedback you receive, and adjust your mail streams as needed. -5. Escalate your DMARC policy tags from 'p=none' to 'p=quarantine' to 'p=reject' as you gain experience. +5. Escalate your DMARC policy tags from 'p=none' to 'p=quarantine' to 'p=reject' as you gain experience. -## 1. Deploy DKIM & SPF by Whitelabeling your Sendgrid IP +## 1. Deploy DKIM & SPF by setting up reverse DNS for your SendGrid IP -Start by completing the Whitelabel process for your account. This ensures that emails sent through your Sendgrid account will be properly signed using DKIM and SPF for your unique domain. -For more information on completing this process, visit the documentation: -http://sendgrid.com/docs/User\_Guide/whitelabel\_wizard.html +Start by setting up reverse DNS for your account. This ensures that emails sent through your SendGrid account will be properly signed using DKIM and SPF for your unique domain. +For more information on completing this process, see [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) -## 2. Ensure proper DKIM and SPF signing for your Whitelabel domain +## 2. Ensure proper DKIM and SPF signing for your authenticated domain -Send yourself some test emails if you're unsure of this step. You're looking to verify that the DKIM and SPF signatures in your email headers align to the domain you've Whitelabeled your Sendgrid account with. ![](https://lh4.googleusercontent.com/kjZ6aO15x8UB3TcHG6X6N3G78rm601i7L6knyLCxw2Ujg4lFNpbG_5DrNK1wHYB6cZ27sIFb87q3rF8wx3xitTJxWQAdtOHqkAlS8CdyoIydj3gKY9w) +Send yourself some test emails if you're unsure of this step. You're looking to verify that the DKIM and SPF signatures in your email headers align to the domain you've authenticated your SendGrid account with. ![](https://lh4.googleusercontent.com/kjZ6aO15x8UB3TcHG6X6N3G78rm601i7L6knyLCxw2Ujg4lFNpbG_5DrNK1wHYB6cZ27sIFb87q3rF8wx3xitTJxWQAdtOHqkAlS8CdyoIydj3gKY9w) As long as both are passing, you’re in business! ## 3. Publish a DMARC record with your DNS registrar, then monitor the results -Within your DNS registrar, you'll need to create a TXT resource record that receivers can use to determine your DMARC preferences. This is done within the DNS registrar of the domain host, likely the same place you created the DNS records for the Whitelabel. This record is made at the root level for the domain, not the subdomain. +Within your DNS registrar, you'll need to create a TXT resource record that receivers can use to determine your DMARC preferences. This is done within the DNS registrar of the domain host, likely the same place you created the DNS records for the authenticated domain. This record is made at the root level for the domain, not the subdomain. ![](https://lh6.googleusercontent.com/d9Cpjrw0_rW_s9KuXTYdfQNISzwOTFTunaDbkHU5frW7se-a3nsEkR2MkTIBGdUF8i6IhOCF88jLF0zGrjajwy2iIxcTdJ6ptxX4avQLsXYeThW_MhI) @@ -64,26 +63,26 @@ The record explained: **p** =quarantine **;** - Policy - Tell receiver to QUARANTINE unqualified mail, which generally means “send this directly to the spam folder”. -**rua** = [mailto:dmarc.rua@customdomain.com](mailto:postmaster@whitelabeldomain.com) Reporting URI of aggregate reports - Send aggregate reports to dmarc.rua [@customdomain.com](mailto:postmaster@whitelabeldomain.com), set this to an email address you control that is closely monitored. +**rua** = [mailto:example@example.com](mailto:postmaster@whitelabeldomain.com) Reporting URI of aggregate reports - Send aggregate reports to dmarc.rua [@customdomain.com](mailto:postmaster@whitelabeldomain.com), set this to an email address you control that is closely monitored. Note: This example uses the p=quarantine policy, but always start out using the p=none policy at first. ### Policies -This is where the magic happens. The policy you select in your DMARC record will tell the participating recipient mail server what to do with mail that doesn’t pass SPF and DKIM, but claims to be from your domain that contains the DMARC record. There are 3 records you can set: p=none, p=quarantine, and p=reject. +This is where the magic happens. The policy you select in your DMARC record will tell the participating recipient mail server what to do with mail that doesn’t pass SPF and DKIM, but claims to be from your domain that contains the DMARC record. There are 3 records you can set: p=none, p=quarantine, and p=reject. -**p=none** - Tell the receiver to perform no actions against unqualified mail, but still send email reports to the mailto: in the DMARC record for any infractions. +**p=none** - Tell the receiver to perform no actions against unqualified mail, but still send email reports to the mailto: in the DMARC record for any infractions. -**p=quarantine** - Tell receiver to quarantine unqualified mail, which generally means “send this directly to the spam folder”. +**p=quarantine** - Tell receiver to quarantine unqualified mail, which generally means “send this directly to the spam folder”. **p=reject** - Tell the receiver to completely deny any unqualified mail for the domain. With this enabled, only mail that is verified as 100% being signed by your domain will even have a chance at the inbox. Any mail that does not pass is blackholed, not bounced, so there’s no way to catch false positives. ## 4. Analyze the feedback you receive and adjust your mail streams as needed -If unqualified mail gets sent to, and received by, recipients participating in DMARC, the recipient will generate reports for these messages and send them back to the mailto: address specified in your DMARC record. These reports will give you the information required to help you evaluate and tune your mail streams with the end goal of determining exactly what services might be sending mail on behalf of your domain. +If unqualified mail gets sent to, and received by, recipients participating in DMARC, the recipient will generate reports for these messages and send them back to the mailto: address specified in your DMARC record. These reports will give you the information required to help you evaluate and tune your mail streams with the end goal of determining exactly what services might be sending mail on behalf of your domain. -Here is a sample report with only one record, showing the results for 2 pieces of mail. -Please note that the listed SPF and DKIM auth\_results are raw results, regardless of the s= alignment. +Here is a sample report with only one record, showing the results for 2 pieces of mail. +Please note that the listed SPF and DKIM auth\_results are raw results, regardless of the s= alignment. The filename is formatted as: filename = receiver "!" policy-domain "!" begin-timestamp "!" end-timestamp "." extension Example: receiver.org!sender.com!1335571200!1335657599.zip @@ -94,13 +93,13 @@ Example: receiver.org!sender.com!1335571200!1335657599.zip ## 5. Escalate your DMARC policy tags from p=none to p=quarantine to p=reject as you gain experience -Now that you’ve tested and tweaked your mail streams to determine exactly who and what is sending mail for your domain, it’s time to turn it up a notch. +Now that you’ve tested and tweaked your mail streams to determine exactly who and what is sending mail for your domain, it’s time to turn it up a notch. Up until now you should have only been using the p=none policy to get reports of any errant behavior, and you should have a good idea of where email is coming from. The next step is to adjust the policy on your DMARC record to start controlling how receivers handle mail claiming to be from your domain. -**p=none** - Get reports of infractions, but no action is taken by recipients as far as processing the messages themselves. +**p=none** - Get reports of infractions, but no action is taken by recipients as far as processing the messages themselves. -**p=quarantine** - Unqualified mail goes directly to spam, but can be recovered. This is useful when you’re fairly certain you know all the locations where mail is coming from, but want to ‘softfail’ any messages that are unqualified until you’re 100% sure. +**p=quarantine** - Unqualified mail goes directly to spam, but can be recovered. This is useful when you’re fairly certain you know all the locations where mail is coming from, but want to ‘softfail’ any messages that are unqualified until you’re 100% sure. **p=reject** - When you’re absolutely sure you know every server and service that is sending email for your domain, signing is in place for each of these services and you want anything with the audacity to claim otherwise completely denied. Unqualified mail is completely deleted by the recipient mail server, never to be seen again. @@ -109,7 +108,7 @@ Up until now you should have only been using the p=none policy to get reports of Overview: [dmarc.org](https://sendgrid.zendesk.com/hc/admin/articles/200182958-Everything-about-DMARC-/dmarc.org) Frequently Asked Questions: [http://dmarc.org/faq.html](http://dmarc.org/faq.html) Specification: [http://dmarc.org/specification.html](http://dmarc.org/specification.html) -Sendgrid Blog Post: [http://sendgrid.com/blog/what-is-dmarc-and-why-should-you-care/](http://sendgrid.com/blog/what-is-dmarc-and-why-should-you-care/) +SendGrid Blog Post: [http://sendgrid.com/blog/what-is-dmarc-and-why-should-you-care/](http://sendgrid.com/blog/what-is-dmarc-and-why-should-you-care/) SPF Syntax: [http://www.openspf.org/SPF\_Record\_Syntax](http://www.openspf.org/SPF_Record_Syntax) Returnpath: [http://www.returnpath.com/solution-content/dmarc-support/](http://www.returnpath.com/solution-content/dmarc-support/) diff --git a/source/Classroom/Basics/Email_Infrastructure/recommended_smtp_settings.md b/source/Classroom/Basics/Email_Infrastructure/recommended_smtp_settings.md deleted file mode 100644 index 9400ff1852..0000000000 --- a/source/Classroom/Basics/Email_Infrastructure/recommended_smtp_settings.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -seo: - title: Recommended SMTP settings - description: Recommended SMTP settings - keywords: password, smtpapi, settings, ports, credentials, authentication, username, integration, smtp, auth, server, port, relay, external, setup, smtp.sendgrid.net -title: Recommended SMTP settings -weight: 0 -layout: page -zendesk_id: 200328026 -navigation: - show: true ---- - -## Integrate with SendGrid using SMTP - -- Change your SMTP authentication username and password to your **SendGrid username and password,** or set up a [teammate]({{root_url}}/User_Guide/Settings/teammates.html) with the **Mail Send** permission set to "Full Access". -- Create an API Key and make sure it has Mail permissions. -- Set the server host to **smtp.sendgrid.net.** This setting can sometimes be referred to as the external SMTP server, or relay, by some programs and services. -- Use the string "apikey" for the SMTP username and use your API key for the password. - -## Ports - -- Use port **25**, **2525**, or **587** for unencrypted / [TLS](https://sendgrid.com/docs/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.html) connections -- Use port **465** for [SSL](https://sendgrid.com/docs/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.html) connections - -**We recommend using port 587** to avoid potential rate limiting. 587 is also the least likely to be blocked by default corporate and residential ISP network settings. - -When using SMTP, You can send 100 messages per SMTP connection at a time, and open up to 10 concurrent connections from a single server at a time. - -For more information on how to integrate with Sendgrid, check out [our Integrate page.](https://sendgrid.com/docs/Integrate/index.html) diff --git a/source/Classroom/Basics/Email_Infrastructure/smtp_ports.md b/source/Classroom/Basics/Email_Infrastructure/smtp_ports.md deleted file mode 100644 index 75fa46a188..0000000000 --- a/source/Classroom/Basics/Email_Infrastructure/smtp_ports.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: page -weight: 0 -title: SMTP Ports -seo: - title: SMTP Ports - description: If you're having difficulty with SendGrid, you can connect via unencrypted or TLS on ports 25, 2525, and 587. You can connect via SSL on port 465. -navigation: - show: true ---- - -{% info %} -If your host will not allow any sort of SMTP connection, please try sending your email through our [v3 Mail API]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html) instead of over SMTP. -{% endinfo %} - -Many hosting providers and ISPs block port 25 as a default practice. When trying to connect to smtp.sendgrid.net remember that ports 25, 2525, 587, and 465 are all available for use. -You can connect via unencrypted or TLS on ports 25, 2525, and 587. You can also connect via SSL on port 465. Keep in mind that many hosting providers and ISPs block port 25 as a default practice. If this is the case, contact your host/ISP to find out which ports are open for outgoing smtp relay. - -{% info %} -We recommend port 587 to avoid any rate limiting that your server host may apply. -{% endinfo %} - -Outbound connections for emails sent via SendGrid utilize opportunistic encryption using TLS. When we deliver your message to its recipient we will attempt to negotiate a TLS connection with the recipient’s mail server. If successful, we send using TLS. If not, a plain connection is used. - -When sending through SendGrid's SMTP Relay, you can [add custom SMTP headers]({{root_url}}/API_Reference/SMTP_API/index.html) to control how your email is sent and what information is included. - diff --git a/source/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.md b/source/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.md index 7cd08c8aee..1842551b4f 100644 --- a/source/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.md +++ b/source/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.md @@ -13,11 +13,11 @@ navigation: TLS (Transport Layer Security) and SSL (Secure Sockets Layer) are protocols that provide data encryption and authentication between applications and servers in scenarios where that data is being sent across an insecure network, such as checking your email. The terms SSL and TLS are often used interchangeably or in conjunction with each other (TLS/SSL), but one is in fact the predecessor of the other — SSL 3.0 served as the basis for TLS 1.0 which, as a result, is sometimes referred to as SSL 3.1. With this said though, _is there actually a practical difference between the two?_ -It used to be believed that TLS v1.0 was marginally more secure than SSL v3.0, its predecessor. However, SSL v3.0 is getting very old and recent developments, such as the [POODLE](http://support.sendgrid.com/hc/en-us/articles/204410613-Jan-7-SSLv3-Disabled-for-API-endpoints) vulnerability have shown that SSL v3.0 is now completely insecure (especially for web sites using it). Even before the POODLE was set loose, the US Government had already mandated that SSL v3 not be used for sensitive government communications or for HIPAA-compliant communications. If that was not enough … POODLE certainly was. In fact, as a result of POODLE, SSL v3 is being disabled on web sites all over the world and for many other services as well. +It used to be believed that TLS v1.0 was marginally more secure than SSL v3.0, its predecessor. However, SSL v3.0 is getting very old and recent developments, such as the [POODLE](http://support.sendgrid.com/hc/en-us/articles/204410613-Jan-7-SSLv3-Disabled-for-API-endpoints) vulnerability have shown that SSL v3.0 is now completely insecure (especially for web sites using it). Even before the POODLE was set loose, the US Government had already mandated that SSL v3 not be used for sensitive government communications or for HIPAA-compliant communications. If that was not enough … POODLE certainly was. In fact, as a result of POODLE, SSL v3 is being disabled on web sites all over the world and for many other services as well. -SSL v3.0 is effectively “dead” as a useful security protocol. Places that still allow its use for web hosting as placing their “secure web sites” at risk; Organizations that allow SSL v3 use to persist for other protocols (e.g. IMAP) should take steps to remove that support at the soonest software update maintenance window. +SSL v3.0 is effectively “dead” as a useful security protocol. Places that still allow its use for web hosting as placing their “secure web sites” at risk; Organizations that allow SSL v3 use to persist for other protocols (e.g. IMAP) should take steps to remove that support at the soonest software update maintenance window. -Subsequent versions of TLS — v1.1 and v1.2 are _significantly more secure _and fix many vulnerabilities present in SSL v3.0 and TLS v1.0. The newer TLS versions, if properly configured, prevent attacks and provide many stronger ciphers and encryption methods. +Subsequent versions of TLS — v1.1 and v1.2 are _significantly more secure_ and fix many vulnerabilities present in SSL v3.0 and TLS v1.0. The newer TLS versions, if properly configured, prevent attacks and provide many stronger ciphers and encryption methods. SendGrid supports TLS v.1.1 and higher. diff --git a/source/Classroom/Basics/Email_Infrastructure/what_is_smtp.md b/source/Classroom/Basics/Email_Infrastructure/what_is_smtp.md deleted file mode 100644 index b0230c0631..0000000000 --- a/source/Classroom/Basics/Email_Infrastructure/what_is_smtp.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -seo: - title: What is SMTP? - description: What is SMTP? - keywords: integration, smtp, mta -title: What is SMTP? -weight: 0 -layout: page -zendesk_id: 202821898 -navigation: - show: true ---- - -You're trying to get email up and running on your website or within your app and everywhere you turn you see the pesky term "SMTP". You think to yourself, "I just want to set up a simple password reset email or welcome email, I don't want to get into the technical stuff". - -At SendGrid we want to make email accessible for everyone. We don't want you to be intimidated by the term so we have a few great resources available to help explain just what **Simple Mail Transfer Protocol ** (or SMTP) really is. - -Check out this great Q&A session between our marketing department's own Warren Duff and Nigel Dunetts from our awesome support team: [http://sendgrid.com/blog/smtp-service-crash-course/](http://sendgrid.com/blog/smtp-service-crash-course/) - - - - - - - diff --git a/source/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.md b/source/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.md index 9746c8b05e..c6bf20ac41 100644 --- a/source/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.md +++ b/source/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.md @@ -64,13 +64,13 @@ Pointing to a Hostname and URL Here you will specify the subdomain and root domain of the receiving domain (or hostname). All emails sent to this receiving domain will be parsed. - The subdomain-domain combination must be unique. We recommend adding a subdomain such as "parse" to ensure that only emails sent to the @parse.example.com are parsed. + If you use the same return path (subdomain) as your authenticated domain, you must have Automatic Security disabled on the authenticated domain. Otherwise, those messages will bounce due to an infinite CNAME>MX loop. {% info %} The URL must be accessible from the public web. {% endinfo %} - **(3)** Enter the subdomain (e.g. "parse") and select the whitelabeled root domain for your receiving domain. Enter the public URL where you would like the parsed data to be POSTed. + **(3)** Enter the subdomain (e.g. "parse") and select the authenticated root domain for your receiving domain. Enter the public URL where you would like the parsed data to be POSTed. ![]({{root}}/images/setting_up_inbound_parse_1.png) @@ -90,7 +90,7 @@ You have just finished configuring Inbound Parse! Testing {% endanchor %} -To test if everything is working, send an email from your email account to anything@parse.yourdomain.com. +To test if everything is working, send an email from your email account to example@example.com. {% info %} The local-part (i.e. anything before @) can be any word or combination because all email for the domain or subdomain will be processed. @@ -99,7 +99,7 @@ The local-part (i.e. anything before @) can be any word or combination because a You can check the [Activity Feed](https://app.sendgrid.com/email_activity?) from your SendGrid dashboard to see if incoming mail was parsed. For more help, see [Debugging a Webhook]({{root_url}}/API_Reference/Webhooks/debug.html). {% warning %} -Remember to direct your incoming email to your hostname (e.g. anything@parse.yourdomain.com). If you do not, your incoming email will not be parsed. +Remember to direct your incoming email to your hostname (e.g. example@example.com). If you do not, your incoming email will not be parsed. {% endwarning %} {% anchor h2 %} @@ -179,8 +179,8 @@ Example Default Payload [Date] array(16) { ["headers"]=> string(1970) "Received: by mx0047p1mdw1.sendgrid.net with SMTP id 6WCVv7KAWn Wed, 27 Jul 2016 20:53:06 +0000 (UTC) -Received: from mail-io0-f169.google.com (mail-io0-f169.google.com [209.85.223.169]) by mx0047p1mdw1.sendgrid.net (Postfix) with ESMTPS id AA9FFA817F2 for ; Wed, 27 Jul 2016 20:53:06 +0000 (UTC) -Received: by mail-io0-f169.google.com with SMTP id b62so81593819iod.3 for ; Wed, 27 Jul 2016 13:53:06 -0700 (PDT) +Received: from mail-io0-f169.google.com (mail-io0-f169.google.com [209.85.223.169]) by mx0047p1mdw1.sendgrid.net (Postfix) with ESMTPS id AA9FFA817F2 for ; Wed, 27 Jul 2016 20:53:06 +0000 (UTC) +Received: by mail-io0-f169.google.com with SMTP id b62so81593819iod.3 for ; Wed, 27 Jul 2016 13:53:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.com; s=ga1; h=mime-version:from:date:message-id:subject:to; bh=DpB1CYYeumytcPF3q0Upvx3Sq/oF4ZblEwnuVzFwqGI=; b=GH5YTxjt6r4HoTa+94w6ZGQszFQSgegF+Jlv69YV76OLycJI4Gxdwfh6Wlqfez5yID 5dsWuqaVJZQyMq/Dy/c2gHSqVo60BKG56YrynYeSrMPy8abE/6/muPilYxDoPoEyIr/c UXH5rhOKjmJ7nICKu1o99Tfl0cXyCskE7ERW0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=DpB1CYYeumytcPF3q0Upvx3Sq/oF4ZblEwnuVzFwqGI=; b=Sq6LVHbmywBdt3sTBn19U8VOmelfoJltz8IcnvcETZsYwk96RBxN+RKMN5fOZSKw4j 15HrgdIFfyDmp67YK0ygvOITlTvZ6XY5I0PtnvDtAQt79kS3tKjI3QKJoEp/ZjIjSzlL KG7agl6cxFgBbIN0yHWBOvy3O+ZXY8tZdom1yOvULjmjW1U9JkdOs+aJ6zq4qhZX/RM/ tIgLB461eJ5V95iQDDc5Ibj9Cvy4vJfXLQRO0nLVQAT2Yz58tkEO1bDZpWOPAyUNneIL yhIWp+SpbuqhMA68mq0krG1PjmWalUbpVcGJIGuOKB9mQFFo/MqdrUCjvYnyo1jPLPeX psdQ== X-Gm-Message-State: AEkoousvdxmDoxLlTUYJ1AOmCGJv77xRBBlfKv6YrthH0M2NueMwlOxUD6t8nidE9uonXbdJ/DQy/chmHUnN//a4 @@ -191,7 +191,7 @@ From: Sender Name Date: Wed, 27 Jul 2016 14:53:05 -0600 Message-ID: Subject: Different File Types -To: parse@parse.yourdomain.com +To: example@example.comom Content-Type: multipart/mixed; boundary=001a113f8ad03e85160538a4343c " ["dkim"]=> @@ -199,7 +199,7 @@ Content-Type: multipart/mixed; boundary=001a113f8ad03e85160538a4343c ["content-ids"]=> string(37) "{"ii_1562e2169c132d83":"attachment1"}" ["to"]=> - string(26) "parse@parse.yourdomain.com" + string(26) "example@example.comom" ["html"]=> string(479) "
      Here's an email with multiple attachments

      Inline image 1

      --


      @@ -213,9 +213,9 @@ Content-Type: multipart/mixed; boundary=001a113f8ad03e85160538a4343c string(14) "209.85.223.169" ["spam_report"]=> string(844) "Spam detection software, running on the system "mx0047p1mdw1.sendgrid.net", has -identified this incoming email as possible spam. The original message +identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label -similar future email. If you have any questions, see +similar future email. If you have any questions, see @@CONTACT_ADDRESS@@ for details. Content preview: Here's an email with multiple attachments [image: Inline image @@ -232,7 +232,7 @@ Content analysis details: (2.6 points, 5.0 required) " ["envelope"]=> - string(66) "{"to":["parse@parse.yourdomain.com"],"from":"example@example.com"}" + string(66) "{"to":["example@example.comom"],"from":"example@example.com"}" ["attachments"]=> string(1) "2" ["subject"]=> @@ -322,7 +322,7 @@ array(11) { ["email"]=> string(8879) "Received: by mx0032p1mdw1.sendgrid.net with SMTP id rOkt2xLLKV Tue, 19 Jul 2016 15:06:29 +0000 (UTC) Received: from mail-it0-f45.google.com (mail-it0-f45.google.com [209.85.214.45]) by mx0032p1mdw1.sendgrid.net (Postfix) with ESMTPS id 26D6080397 for ; Tue, 19 Jul 2016 15:06:22 +0000 (UTC) -Received: by mail-it0-f45.google.com with SMTP id f6so93587860ith.1 for ; Tue, 19 Jul 2016 08:06:22 -0700 (PDT) +Received: by mail-it0-f45.google.com with SMTP id f6so93587860ith.1 for ; Tue, 19 Jul 2016 08:06:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sendgrid.com; s=ga1; h=mime-version:from:date:message-id:subject:to; bh=UYWCIUKTVXyV9U41l+c9+qOlpoeQGcJkKpyOAatNr3Y=; b=c1I/LcqHEJklmAThWr9Z8NKlTPHUlE/8sDSpK382fJtIQcGdUtczG0pijnUHegrFVt FDr4NehtJDD9KFvXLXboLCtObsu5HTN99ckUCCZTibZseA+J8U3jjCqTdj1fmUage5C7 //Iwi0Ndioonzhm18J7KStap66yZ69ED7UxPk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=UYWCIUKTVXyV9U41l+c9+qOlpoeQGcJkKpyOAatNr3Y=; b=lgmLXnmmpNcQMckjshsZsa2/8OjFZzntWYSG5XZo0fi32KHLuBLSHuNDFXn0V4ICp1 1xuT2fZCyhBSgNBiWNbjqFspdemzrBjaI1Tgm/Zz8Fv6wW2XdjpoANNQzJxfdhnecPd5 HvZ5P8+KTqjr4tAa9RmLthDc3UqhV9NRnCnhbW/AZaVQLB8eoJus92tD1GeXpBQml5XF m6vPUGrWGZWNugINkRKxIpk+2uECglAjNm4NpZIi9j7N94CxA18RC4NJ59WIsSybtIer hbCgT1Q13rvGEzvnp6FfFQVbE3DOibNqd0bh/EvZCagFVbnenNc/Q+qHtU9KqFlisSOp xh0w== X-Gm-Message-State: ALyK8tINVaZIP8YCgQbpg5ya8EnqQo76uxkXUPpDnM+kAyAQQzehFU10EgyuAe2fAmWf/muBiFDy0JDU74Eclp1/ @@ -333,7 +333,7 @@ From: Sender Name Date: Tue, 19 Jul 2016 09:06:21 -0600 Message-ID: Subject: Hello -To: parse@parse.yourdomain.com +To: example@example.comom Content-Type: multipart/mixed; boundary=001a11447dc881e40f0537fe6d5a --001a11447dc881e40f0537fe6d5a @@ -462,16 +462,16 @@ AFtDb250ZW50X1R5cGVzXS54bWxQSwUGAAAAAAgACAD/AQAAmw4AAAAA --001a11447dc881e40f0537fe6d5a-- " ["to"]=> - string(22) "parse@parse.yourdomain.com" + string(22) "example@example.comom" ["from"]=> string(33) "Sender Name " ["sender_ip"]=> string(13) "209.85.214.45" ["spam_report"]=> string(798) "Spam detection software, running on the system "mx0032p1mdw1.sendgrid.net", has -identified this incoming email as possible spam. The original message +identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label -similar future email. If you have any questions, see +similar future email. If you have any questions, see @@CONTACT_ADDRESS@@ for details. Content preview: This is a test email with 1 attachment. @@ -485,7 +485,7 @@ Content analysis details: (0.4 points, 5.0 required) " ["envelope"]=> - string(73) "{"to":["parse@parse.yourdomain.com"],"from":"example@example.com"}" + string(73) "{"to":["example@example.comom"],"from":"example@example.com"}" ["subject"]=> string(5) "Hello" ["spam_score"]=> diff --git a/source/Classroom/Basics/Integrate/interspire_integration.md b/source/Classroom/Basics/Integrate/interspire_integration.md index 2bf8684cf9..0e130ba56a 100644 --- a/source/Classroom/Basics/Integrate/interspire_integration.md +++ b/source/Classroom/Basics/Integrate/interspire_integration.md @@ -28,7 +28,7 @@ In order to set Email Marketer's outbound mail server to point to SendGrid, clic - **SMTP Hostname** : smtp.sendgrid.net - **SMTP Username** : [your SendGrid account's username] - **SMTP Password** : [your SendGrid account's password] -- **SMTP Port** : [the port of your choosing, the options for which can be found [here](http://sendgrid.com/docs/Integrate/index.html)] +- **SMTP Port** : [the port of your choosing. For more information, see [How to Send an SMTP Email](https://sendgrid.com/docs/API_Reference/SMTP_API/getting_started_smtp.html)] Once these settings changes have been made within the Email Settings page within your Email Marketer account, all mail from the application will be sent to SendGrid so we can send it to the end recipient. Simple as that. diff --git a/source/Classroom/Basics/Marketing_Campaigns/contact_fields.md b/source/Classroom/Basics/Marketing_Campaigns/contact_fields.md deleted file mode 100644 index 45c3d2926b..0000000000 --- a/source/Classroom/Basics/Marketing_Campaigns/contact_fields.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -st: - published_at: 2017-01-25 - type: Classroom -seo: - title: What is the difference between custom fields, reserved fields, and system fields? - description: There are several different fields you can use to store and organize information about your contacts. - keywords: custom fields, reserved fields, fields, substitution tags, substitution, tags, system field, contacts, segmentation -title: What is the difference between custom fields, reserved fields, and system fields? -weight: 0 -layout: page -navigation: - show: true ---- - -Every contact in Marketing Campaigns starts with a unique email address. From there, you can enrich each of your contact profiles by adding additional descriptive data in the form of custom fields and reserved fields. SendGrid will also provide engagement data for each contact you upload and deliver email to. - -These various customer data points are extremely useful when creating [dynamic segments]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html#-Create-a-Segment) of your recipients or customizing campaign content with substitution tags. - -{% anchor h2 %} -Reserved Fields -{% endanchor %} - -When creating or uploading a new contact in Marketing Campaigns, you must always include that contact's email address. This is the only required contact field, and is reserved for your contact's email address. - -There are two reserved fields representing your contacts' names: **first_name** and **last_name**. The values of the reserved custom fields **first_name** and **last_name** can be edited at any time, but the types of these fields cannot be changed. - -The **lists** custom field represents the various lists that a contact belongs to. This field excludes any segments. While this field cannot be edited directly, it is updated whenever you add or remove your contact from a list. - -{% info %} -Reserved fields do **not** count towards your allotment of 60 custom fields. -{% endinfo %} - - - - - - - -
      Field NameDescriptionField TypeCan be edited?Substitution tag in campaign builder?
      emailThe contact's email address.textyesyes
      first_nameThe contact's first name.textyesyes
      last_nameThe contact's last name.textyesyes
      listsThis field contains all of the lists that this contact belongs to.textYes. By changing the associated lists for this contact.no
      - -{% anchor h2 %} -Custom Fields -{% endanchor %} - -You can create and edit custom fields that are particularly relevant to your email strategy, such as city, gender, age, or even plan type. - -{% info %} -You can create up to 60 custom fields; 20 each of the following custom field types: date, text, or number. -{% endinfo %} - -The following options may be configured when creating a new custom field: - -* **Field Name -** Any name of your choice, but cannot contain one of the reserved field names listed above. For more info, [click here]({{root_url}}/Classroom/Troubleshooting/Authentication/you_have_used_a_reserved_field_name_for_your_custom_field.html"). Only use alphanumeric characters (letters A-Z, numbers 0-9). Spaces are not permitted, but you may use underscores. -* **Field Type -** Can be **date**, **text**, or **number** - -Custom fields are a great way to segment your recipient list into more targeted, smaller groups, such as “women in Chicago.” Custom fields also allow you to personalize the content of your campaigns for individual contacts using substitution tags. - -{% info %} -Spaces are not permitted when creating a custom field in the Marketing Campaigns application. However, if you are uploading a CSV of contacts with custom fields, SendGrid will automatically replace the spaces with underscores when importing your contacts. -{% endinfo %} - -{% anchor h2 %} -Segmentation -{% endanchor %} - -If you have different demographics (or just groups of contacts with similar traits) that you want to send a targeted campaign to, custom fields can be a great way to achieve this segmentation. - -As you add contacts to your list, make sure to record any data relevant to your campaign strategy in a custom field. Then when you're ready to send your campaign, select a segment that you have created based on your desired custom fields. We recommend creating these segments before it is time to deliver your campaign. - -![]({{root_url}}/images/contact_fields_1.png) - -{% anchor h3 %} -Content Personalization -{% endanchor %} - -Custom fields also allow you to customize the content of your campaigns so that it is specifically relevant to each of your recipients by means of **substitution tags**. Every custom field you create also populates as a substitution tag. - -From the “Tags” tab of the editor, simply copy the substitution tag you wish to insert and paste it where you would like its value to be inserted in your email. When your email is sent the substitution tags will automatically be replaced (or "substituted") with each contact's corresponding custom field value. [Having trouble getting a custom field to substitute?]({{root_url}}/Classroom/Troubleshooting/Authentication/a_custom_field_value_did_not_substitute_during_a_send.html) - -{% anchor h2 %} -Engagement Data -{% endanchor %} - -After you first create a new contact, Marketing Campaigns begins building a history of this contact over time, tracking key dates and engagement that can be very useful when creating dynamic segments of your contacts. - -The fields that make up this engagement data include things like the date that you originally uploaded your contact to Marketing Campaigns, the date that you last changed or updated your contact, and the dates when you last sent a campaign to your contact, when your contact last opened one of your campaigns, and when your contact last clicked a link in one of your campaigns. - -These various fields enable you to identify which contacts are most engaged with your campaigns, thus allowing you to better target your content. As an example, you may wish to send a follow-up email to everyone who opened a particular campaign, since these recipients have demonstrated interest in the topic. - -![]({{root_url}}/images/contact_fields_2.png) - - - - - - - - -
      Field NameDescriptionField TypeCan be edited?Substitution tag in campaign builder?
      Date AddedThe date that the contact was uploaded to SendGrid.datenono
      Last UpdatedThe date that the contact was most recently updated.datenono
      Last EmailedThe date that the contact was last emailed.datenono
      Last ClickedThe date that the contact last clicked on a link in your email.datenono
      Last OpenedThe date that the contact last opened one of your emails.datenono
      - -{% anchor h3 %} -System Substitution Tags -{% endanchor %} - -There are some substitution tags available in the campaign builder that allow you to dynamically insert specific content into your campaign, such as web links, unsubscribe links, or links to your campaign's subscription preferences page. _These system substitution tags are not related to your contact data_ and should not be confused with reserved or custom fields. - -For a more detailed discussion of these tags with information on how to use them, see our Classroom article titled [Unsubscribe, Sender ID, and Weblink System Tags]({{root_url}}/Classroom/Basics/Marketing_Campaigns/default_mc_tags.html). diff --git a/source/Classroom/Basics/Marketing_Campaigns/default_mc_tags.md b/source/Classroom/Basics/Marketing_Campaigns/default_mc_tags.md index f5b062236f..b6461a64ed 100644 --- a/source/Classroom/Basics/Marketing_Campaigns/default_mc_tags.md +++ b/source/Classroom/Basics/Marketing_Campaigns/default_mc_tags.md @@ -49,13 +49,13 @@ Sender Identity information To create a new Sender Identity, navigate to **Marketing Campaigns** in the left hand sidebar, and select **Senders**. Click **Create New Sender** and enter the details of your new sender. {% endinfo %} -**[Sender_Address] -** Inserts the the physical address associated with the Sender Identity chosen for the campaign. This is required in order to be compliant with [CAN-SPAM]({{root_url}}/Glossary/can_spam.html). +**[Sender_Address] -** Inserts the physical address associated with the Sender Identity chosen for the campaign. This is required in order to be compliant with [CAN-SPAM]({{root_url}}/Glossary/can_spam.html). -**[Sender_City] -** Inserts the the city associated with the sender identity chosen for the Campaign. This is required in order to be compliant with [CAN-SPAM]({{root_url}}/Glossary/can_spam.html). +**[Sender_City] -** Inserts the city associated with the sender identity chosen for the Campaign. This is required in order to be compliant with [CAN-SPAM]({{root_url}}/Glossary/can_spam.html). -**[Sender_State] -** Inserts the the state associated with the sender identity chosen for the Campaign. This is required in order to be compliant with [CAN-SPAM]({{root_url}}/Glossary/can_spam.html). +**[Sender_State] -** Inserts the state associated with the sender identity chosen for the Campaign. This is required in order to be compliant with [CAN-SPAM]({{root_url}}/Glossary/can_spam.html). -**[Sender_Zip] -** Inserts the the zip code associated with the sender identity chosen for the Campaign. This is required in order to be compliant with [CAN-SPAM]({{root_url}}/Glossary/can_spam.html). +**[Sender_Zip] -** Inserts the zip code associated with the sender identity chosen for the Campaign. This is required in order to be compliant with [CAN-SPAM]({{root_url}}/Glossary/can_spam.html). {% info %} **[Sender_State]** and **[Sender_Zip]** are not required for international senders. If you reside outside of the USA, you may leave these fields blank. diff --git a/source/Classroom/Basics/Marketing_Campaigns/how_to_remove_unusable_contacts.md b/source/Classroom/Basics/Marketing_Campaigns/how_to_remove_unusable_contacts.md deleted file mode 100644 index 2efaa85411..0000000000 --- a/source/Classroom/Basics/Marketing_Campaigns/how_to_remove_unusable_contacts.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -seo: - title: How to Remove Unusable Contacts - description: Learn how you can delete contacts that result in bounces or spam reports. - keywords: marketing, campaign, unusable, unwanted, contacts -title: How to Remove Unusable Contacts -weight: 0 -layout: page -navigation: - show: true ---- - -It is common to have contacts that result in a group unsubscribe, block, bounce, invalid email address, or spam report. Attempting to send email to these contacts can negatively impact your reputation since these contacts do not want to (and will not) receive your marketing emails. By continuing to store these contacts, you are being charged for recipients that will automatically be dropped. - -The following steps will show you how to remove all of your unusable Marketing Campaigns contacts so that you won't continue to be charged for their storage. - -1. When viewing your dashboard, navigate to the left hand menu and click **Suppressions**. - -2. Open a specific group, such as Bounces or Spam Reports, click the settings cog in the upper right corner, then select **Download as CSV**. - - ![]({{root_url}}/images/remove_unusable_contacts_1.png) - -3. Repeat step 2 for each of the groups that you want to remove (e.g. unsubscribes, spam reports etc.) and merge each of those lists into a single CSV file. - -4. Return to your dashboard, navigate to the left hand menu and select **Marketing**, then **Contacts**. - -5. In the upper right corner click **Add List or Segment** and select **Upload CSV**. - -6. You will be presented with a dialogue box. Select the option to **Create New List** and name it something obvious, like "Remove Invalid Emails." - -7. Once uploaded, click the cog to the right of that new list and select **Delete**. - -8. Another dialogue box will open asking if you wish to delete "all contacts associated with this list". Make sure that box is checked, and then you're good to go! - -![]({{root_url}}/images/remove_unusable_contacts_2.png) diff --git "a/source/Classroom/Basics/Marketing_Campaigns/icon\r" "b/source/Classroom/Basics/Marketing_Campaigns/icon\r" deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/source/Classroom/Basics/Marketing_Campaigns/index.html b/source/Classroom/Basics/Marketing_Campaigns/index.html deleted file mode 100644 index 050562df27..0000000000 --- a/source/Classroom/Basics/Marketing_Campaigns/index.html +++ /dev/null @@ -1,214 +0,0 @@ ---- -seo: - title: Marketing Campaigns Overview - description: A collection of our Marketing Campaigns information and tutorials. - keywords: overview, index, Marketing Campaigns, marketing email, email marketing, deliverability, list, contacts, best practices, spam, troubleshooting -title: Marketing Campaigns Overview -weight: 100 -layout: page -navigation: - show: true ---- - -
      - -
      - -

      - Marketing Campaigns is SendGrid's flexible email marketing solution that allows you to create beautiful, targeted campaigns. Built on SendGrid's proven email deliverability platform, Marketing Campaigns provides powerful dynamic segmentation, flexible campaign building workflows, and version testing. After you have created and sent a campaign, make sure to take advantage of the collected engagement, deliverability, and performance statistics to gain insight into how you can optimize your next campaign. -

      - -

      - This page provides links to all of SendGrid's Marketing Campaigns documentation. You will find everything from instructional User Guides, step-by-step tutorials, troubleshooting guides, FAQs, and definitions of common terms and abbreviations. -

      - -{% anchor h2 %} -Table of Contents -{% endanchor %} - - - -{% anchor h2 %} -Common Terms and Abbreviations -{% endanchor %} - -

      - Here are some common terms and abbreviations used in Marketing Campaigns, or general email marketing discussions. -

      - - - -{% anchor h2 %} -Marketing Campaigns Introduction -{% endanchor %} - -

      - Introductory information to help you get started using Marketing Campaigns right away. You will find answers to common questions, an explanation of how you will be billed for Marketing Campaigns, and other additional resources for new users. -

      - - - -{% anchor h2 %} -Marketing Campaigns User Guide -{% endanchor %} - -

      - Complete user guide for Marketing Campaigns. You will find detailed descriptions of all of Marketing Campaign's features, along with tutorials and instructions for how to leverage Marketing Campaigns. -

      - - - -{% anchor h2 %} -Contact List Best Practices -{% endanchor %} - -

      - Your Contacts (or recipients) are at the core of your email marketing campaign. Ensuring that you are sending to the right set recipients, at the right time, is vital to the success of your campaign. Here you will find several articles discussing best practices, along with tutorials explaining how to manage your contact lists. -

      - - - -{% anchor h2 %} -Deliverability Best Practices -{% endanchor %} - -

      - Even if you have the perfect list of contacts to send your campaign to, there are still many other ways that your campaign could end up in the spam folder. Following is a list of articles dedicated to email deliverability as it relates to Marketing Campaigns: from brand consistency to navigating spam-traps. -

      - -{% anchor h3 %} -Common Deliverability Terms -{% endanchor %} - - - -{% anchor h3 %} -Deliverability Best Practices -{% endanchor %} - - - -{% anchor h2 %} -Troubleshooting -{% endanchor %} - -

      - Having trouble getting your CSV uploaded? Are your custom fields not working the way you expected? Look below for some possible solutions. -

      - - - -{% anchor h2 %} -Statistics and Tracking -{% endanchor %} - -

      - Marketing Campaigns provides an advanced and powerful set of tools dedicated to collecting and reviewing statistics. Analyzing your deliverabilty and engagement metrics is key to optimizing your campaigns. -

      - - - -{% anchor h2 %} -Migration -{% endanchor %} - -

      - If you are migrating to Marketing Campaigns from SendGrid's Legacy Newsletter, we recommend referring to our Migration Toolkit. Here you will find a complete set of step-by-step tutorials, video tutorials, side-by-side feature comparisions, and other resources to help ensure that your transition to Marketing Campaigns is smooth and seamless. -

      - - - -{% anchor h2 %} -Marketing Campaigns Recipient Unsubscribes -{% endanchor %} - -

      - Maintaining a healthy list of engaged and interested contacts is critical to the success of your email marketing program. Part of that process includes making it easy for your contacts to unsubscribe to email that they no longer want to receive. -

      - - diff --git a/source/Classroom/Basics/Marketing_Campaigns/marketing_campaigns_faqs.md b/source/Classroom/Basics/Marketing_Campaigns/marketing_campaigns_faqs.md index 97e77cb0a6..71486ae94f 100644 --- a/source/Classroom/Basics/Marketing_Campaigns/marketing_campaigns_faqs.md +++ b/source/Classroom/Basics/Marketing_Campaigns/marketing_campaigns_faqs.md @@ -41,20 +41,6 @@ Table of Contents - [What is the difference between suppression groups and unsubscribe groups?](#-What-is-the-difference-between-suppression-groups-and-unsubscribe-groups) - [Where can I find a list of contacts who have marked one of my campaigns as spam?](#-Where-can-I-find-a-list-of-contacts-who-have-marked-one-of-my-campaigns-as-spam) - [How many campaigns can I create?](#-How-many-campaigns-can-I-create) -* [**Contacts & CSV Uploading**](#-Contacts--CSV-Uploading) - - [How come my list and segment counts aren't updated after adding new contacts?](#-How-come-my-list-and-segment-counts-arent-updated-after-adding-new-contacts) - - [How do I add an existing contact to an existing list?](#-How-do-I-add-an-existing-contact-to-an-existing-list) - - [How do I update the custom fields for one of my contacts?](#-How-do-I-update-the-custom-fields-for-one-of-my-contacts) - - [How do I update an existing contact list?](#-How-do-I-update-an-existing-contact-list) - - [Why am I receiving errors when uploading a CSV?](#-Why-am-I-receiving-errors-when-uploading-a-CSV) - - [What do I need to know to format my CSVs correctly?](#-What-do-I-need-to-know-to-format-my-CSVs-correctly) - - [Why does my contact upload summary email show a smaller total than the number of contacts I uploaded?](#-Why-does-my-contact-upload-summary-email-show-a-smaller-total-than-the-number-of-contacts-I-uploaded) - - [What is the file size limit when uploading CSVs?](#-What-is-the-file-size-limit-when-uploading-CSVs) - - [How long will it take to upload a CSV?](#-How-long-will-it-take-to-upload-a-CSV) -* [**Segmentation**](#-Segmentation) - - [Why can't I search for partial words of custom fields when creating a segment?](#-Why-cant-I-search-for-partial-words-of-custom-fields-when-creating-a-segment) - - [How do I view which specific recipients have opened or clicked within one of my campaigns?](#-How-do-I-view-which-specific-recipients-have-opened-or-clicked-within-one-of-my-campaigns) - - [What is the maximum number of lists and segments that I can create?](#-What-is-the-maximum-number-of-lists-and-segments-that-I-can-create) * [**Sending Campaigns**](#-Sending-Campaigns) - [How come one of my substitution tags wasn't replaced during a send?](#-How-come-one-of-my-substitution-tags-wasnt-replaced-during-a-send) - [Why aren't my substitution tags replaced in my test send?](#-Why-arent-my-substitution-tags-replaced-in-my-test-send) @@ -124,8 +110,6 @@ Yes! The link tracking tab on your campaign's stats page displays your link clic To see these stats, click **Campaigns** under **Marketing Campaigns** in the left hand side bar. Click the gear icon next to your A/B test campaign and select **Stats**. Scroll down until you see the section titled **Link Tracking**. Here you will find your click tracking stats for all of the links in each of your test versions. -********** - {% anchor h2 %} Billing & Pricing {% endanchor %} @@ -148,7 +132,7 @@ You will be charged to store all of your contacts, regardless of whether or not Your parent account will be billed for each unique contact, regardless of how many lists or segments that contact appears on. However, if there are one or more subusers under a parent account, the parent account will be billed for all unique contacts stored on each account, even if the same contact is stored on multiple accounts. {% endinfo %} -For example, if a SendGrid parent account uploads a contact with the address `johndoe@example.com` and a single subuser of that parent account also uploads a contact for `johndoe@example.com`, then the parent account will be billed twice for that contact. +For example, if a SendGrid parent account uploads a contact with the address `johndoeexampexample@example.com` and a single subuser of that parent account also uploads a contact for `johndoeexampexample@example.com`, then the parent account will be billed twice for that contact. Unsubscribed contacts will not consume email credits when you send via Marketing Campaigns, even if those unsubscribed contacts are included in the list or segment you are sending to. @@ -166,8 +150,6 @@ Can I pay a prorated rate if I don't store my contacts for an entire month? There is no monthly proration for contact storage. You will be charged for the maximum size that your contact list reaches each month. For example, if you upload your contacts on the last day of the month, you will still be charged the full amount to store those contacts that month. -********** - {% anchor h2 %} Campaigns & Campaign Editor {% endanchor %} @@ -176,7 +158,7 @@ Campaigns & Campaign Editor How come I can't select a sender ID in the campaign editor after creating it? {% endanchor %} -Make sure that you have verified the sender ID you are trying to select. You can only select a verified sender ID when sending a campaign. You can resend a sender ID verification email from the sender ID's details page. Any sender you create using a domain you have already [whitelabeled]({{root_url}}/Classroom/Basics/Whitelabel/index.html) will automatically be verified. +Make sure that you have verified the sender ID you are trying to select. You can only select a verified sender ID when sending a campaign. You can resend a sender ID verification email from the sender ID's details page. Any sender you create using a domain you have already [authenticated]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) will automatically be verified. ![]({{root_url}}/images/mc_faq_4.gif) @@ -244,7 +226,7 @@ Make sure that you have inserted the [unsubscribe] tag in the body of your campa What is an unsubscribe group? {% endanchor %} -An _unsubscribe group_ is a group of recipients that we will not send emails to. Unsubscribe groups allow your readers to opt out of certain types or groups of emails instead of globally unsubscribing from _all_ of your emails. A common example, would be to have one group for “Account” messages like password resets and shipping notifications, and another group for “Marketing” messages, so that users unsubscribing from marketing email don’t mistakenly miss password reminder emails. For more information on using unsubscribe links in your campaigns, [click here]({{root_url}}/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html). +An _unsubscribe group_ is a group of recipients that we will not send emails to. Unsubscribe groups allow your readers to opt out of certain types or groups of emails instead of globally unsubscribing from _all_ of your emails. A common example, would be to have one group for “Account” messages like password resets and shipping notifications, and another group for “Marketing” messages, so that users unsubscribing from marketing email don’t mistakenly miss password reminder emails. For more information on using unsubscribe links in your campaigns, [click here]({{root_url}}/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html). {% anchor h3 %} What is the difference between suppression groups and unsubscribe groups? @@ -268,111 +250,6 @@ How many campaigns can I create? You can create up to 2500 different campaigns. -********** - -{% anchor h2 %} -Contacts & CSV Uploading -{% endanchor %} - -{% anchor h3 %} -How come my list and segment counts aren't updated after adding new contacts? -{% endanchor %} - -It is normal to see a slight delay between uploading contacts and seeing your list counts get updated, but if you still don't see your list counts updated after 30 minutes please reach out to Support or your Customer Success Manager. - -{% anchor h3 %} -How do I add an existing contact to an existing list? -{% endanchor %} - -Navigate to your contacts page and search for the contact that you want to add. Click on that contact and scroll down until you see the **Associated Lists** tab. On this tab you'll find a drop down menu allowing you to select a preexisting list to add this contact to. - -![]({{root_url}}/images/mc_faq_7.gif) - -{% anchor h3 %} -How do I update the custom fields for one of my contacts? -{% endanchor %} - -You can re-upload a CSV containing your new custom fields. You can also manually edit the custom fields for an individual contact by navigating to your Contacts page in Marketing Campaigns, searching for and selecting the contact that you want to update, and scrolling down to the **Custom Fields** tab. Finally, click **Edit** to begin updating your contact's custom fields. - -![]({{root_url}}/images/mc_faq_8.gif) - -{% anchor h3 %} -How do I update an existing contact list? -{% endanchor %} - -You can either upload a CSV of contacts to an existing list or you can manually add contacts to a list. - -To upload a CSV to an existing list, navigate to the Contacts page and click **Add List or Segment**. Click **Upload CSV**. Under the dropdown menu titled **Add to an existing list** select the list you want to add your new contacts to. Continue with the CSV upload process as described here. - -To manually add a contact to an existing list, navigate to the Contacts page and click **Add List or Segment**. Click **Manual Add**. Under the dropdown menu titled **Add to an existing list** select the list you want to add your new contact to. Continue adding your contact as described [here]({{root_url}}/User_Guide/Marketing_Campaigns/contacts.html#-Add-Contacts-From-a-CSV). - -{% anchor h3 %} -Why am I receiving errors when uploading a CSV? -{% endanchor %} - -The most common reason users receive errors when uploading CSVs is that there are incorrectly formatted dates in the CSV file. Make sure that your dates all have 4 year digits and are in MM/DD/YYYY format. If you are still having problems, double check the CSV upload steps described [here]({{root_url}}/User_Guide/Marketing_Campaigns/contacts.html#-Uploading-Contacts). - -{% anchor h3 %} -What do I need to know to format my CSVs correctly? -{% endanchor %} - -* Only .csv files are allowed -* A header row is required for all CSV uploads -* "Email" header field is always required -* Headers must use letters, numbers, and underscore characters only -* Date fields can be represented in the form: MM/DD/YYYY -* Years in date fields must be represented as their full value (e.g. 1999 not 99) - -For more detailed info, check out this page on [Preparing your contacts for upload]({{root_url}}/User_Guide/Marketing_Campaigns/contacts.html#-Prepare-Contacts-for-Upload). - -{% anchor h3 %} -Why does my contact upload summary email show a smaller total than the number of contacts I uploaded? -{% endanchor %} - -You have probably uploaded duplicate contacts. Double check your CSV for duplicates, and if you are certain there are none, please reach out to your Customer Success Manager or contact Support. - -{% anchor h3 %} -What is the file size limit when uploading CSVs? -{% endanchor %} - -You can upload CSV files up to 2GB in size. - -{% anchor h3 %} -How long will it take to upload a CSV? -{% endanchor %} - -With a relatively simple CSV containing only the email, first_name, and last_name fields you should expect to see 8 million contacts uploaded in 6 hours (or about 2.7 seconds per 1,000 contacts). As you increase the number of custom fields included in your CSV, the amount of time required will increase. - -********** - -{% anchor h2 %} -Segmentation -{% endanchor %} - -{% anchor h3 %} -Why can't I search for partial words of custom fields when creating a segment? -{% endanchor %} - -We currently only allow full word searches when searching for custom field values. The only exception is email addresses: you may search for parts of a word or address when looking up email addresses. For example, a search for "gmail" might return gmail.com, gmail.cn, x.gmail.com, etc. - -{% anchor h3 %} -How do I view which specific recipients have opened or clicked within one of my campaigns? -{% endanchor %} - -To quickly view which recipients have either opened one of your campaigns or have clicked within one of your campaigns, click **Campaigns** under **Marketing Campaigns** in the left hand navigation menu. Click the campaign you're interested in, and hover your cursor over either the "Unique Opens" or "Unique Clicks" tile and click **View Details**. - -![]({{root_url}}/images/mc_faq_2.png) - -You can also create a segment of recipients that have either opened or click within one of your campaigns based on your campaign's engagement statistics. For detailed instructions on how to use your engagement stats, [visit our User Guide]({{root_url}}/User_Guide/Marketing_Campaigns/campaigns.html#-Engagement-Statistics). For other ideas on how to leverage these engagement stats, [checkout this classroom article]({{root_url}}/Classroom/Basics/Marketing_Campaigns/engagement_stats.html). - -{% anchor h3 %} -What is the maximum number of lists and segments that I can create? -{% endanchor %} - -You can create up to 100 lists and 100 segments. Each resource is independently limited to 100. In other words, you can create 100 lists and 100 segments, but not 200 of one and 0 of the other. - -********** - {% anchor h2 %} Sending Campaigns {% endanchor %} @@ -399,7 +276,7 @@ It can take up to 5 minutes before an unsubscribed contact will appear in an uns How do I unschedule a campaign that I don't want to send? {% endanchor %} -You can unschedule a campaign by navigating to your list of campaigns, clicking the action cog next to the campaign you want to stop and clicking **Unschedule**. This returns the campaign to "draft" form. Also see _[How do I edit a scheduled campaign?](#-How-do-I-edit-a-scheduled-campaign)_ for additional detail. +You can unschedule a campaign by navigating to your list of campaigns, clicking the action menu next to the campaign you want to stop and clicking **Unschedule**. This returns the campaign to "draft" form. Also see _[How do I edit a scheduled campaign?](#-How-do-I-edit-a-scheduled-campaign)_ for additional detail. {% anchor h3 %} How do I stop a campaign send? @@ -443,8 +320,6 @@ All email sent through Marketing Campaigns is required to have an unsubscribe li The [unsubscribe] tag must always be present, and you must always either select an unsubscribe group or include a custom unsubscribe URL. For detailed instructions on adding unsubscribe links to your campaigns, [click here]({{root_url}}/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html). -********** - {% anchor h2 %} Sender Verification {% endanchor %} @@ -453,7 +328,7 @@ Sender Verification Why didn't I receive a sender ID verification email? {% endanchor %} -If you didn't receive a sender ID verification email, try requesting the verification email to be resent. Simply navigate to Marketing Campaigns in the left hand navigation menu and click on **Senders**. Next to the sender you need to verify, click the action cog and select **Resend Verification**. +If you didn't receive a sender ID verification email, try requesting the verification email to be resent. Simply navigate to Marketing Campaigns in the left hand navigation menu and click on **Senders**. Next to the sender you need to verify, click the action menu and select **Resend Verification**. ![]({{root_url}}/images/mc_faq_4.gif) @@ -467,9 +342,7 @@ If you clicked the link in your sender ID verification email, but had to sign in How long is the sender ID verification link valid? {% endanchor %} -The URL in your sender ID verification email is valid for 48 hours. After 48 hours you will have to request a new verification email to be delivered. To resend your verification email, navigate to Marketing Campaigns in the left hand navigation menu and click **Senders**. Next to the sender you need to verify, click the action cog and select **Resend Verification**. - -********** +The URL in your sender ID verification email is valid for 48 hours. After 48 hours you will have to request a new verification email to be delivered. To resend your verification email, navigate to Marketing Campaigns in the left hand navigation menu and click **Senders**. Next to the sender you need to verify, click the action menu and select **Resend Verification**. {% anchor h2 %} Stats @@ -505,6 +378,6 @@ Currently, you can see your aggregate stats over all time, and the graph display How do I view statistics for a specific campaign? {% endanchor %} -Under **Marketing Campaigns** in the left hand navigation menu, select **Campaigns**. Find the campaign you want to see stats for in the list and click the action cog on the right. Click **Stats** to view statistics for that specific campaign. +Under **Marketing Campaigns** in the left hand navigation menu, select **Campaigns**. Find the campaign you want to see stats for in the list and click the action menu on the right. Click **Stats** to view statistics for that specific campaign. ![]({{root_url}}/images/mc_faq_9.gif) diff --git a/source/Classroom/Basics/Marketing_Campaigns/migrating_content.md b/source/Classroom/Basics/Marketing_Campaigns/migrating_content.md deleted file mode 100644 index 6083dc6e38..0000000000 --- a/source/Classroom/Basics/Marketing_Campaigns/migrating_content.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -seo: - title: Migrating Content from Legacy Newsletter to Marketing Campaigns - description: - keywords: image, text, newsletter, html, css, migrate, assets, content, copy, blast, move, promotion -title: Migrating Content from Legacy Newsletter to Marketing Campaigns -weight: 0 -layout: page -zendesk_id: 206300238 -navigation: - show: true ---- - - - -Marketing Campaigns offers a library of responsive templates as well as an easy-to-use campaign builder. However, if you have templates in Legacy Newsletter that you’d like to reuse in Marketing Campaigns, here’s a [step-by-step migration guide]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_content.html) from our [Legacy Newsletter Migration Toolkit]({{root_url}}/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/index.html). diff --git a/source/Classroom/Basics/Marketing_Campaigns/migrating_images.md b/source/Classroom/Basics/Marketing_Campaigns/migrating_images.md deleted file mode 100644 index 6eee11354d..0000000000 --- a/source/Classroom/Basics/Marketing_Campaigns/migrating_images.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -seo: - title: Migrating Images from Legacy Newsletter into Marketing Campaigns - description: Learn how to migrate images from Legacy Newsletter into the Marketing Campagins Image Library - keywords: images, marketing, newsletter, export, migrate, import, move -title: Migrating Images from Legacy Newsletter into Marketing Campaigns -weight: 0 -layout: page -navigation: - show: true ---- - - - -The Marketing Campaigns image library makes it easy to upload and manage your images. The Legacy Newsletter [Migration Toolkit]({{root_url}}/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/index.html) provides [step-by-step instructions]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_images.html) explaining how to seamlessly migrate your images from Legacy Newsletter to Marketing Campaigns. diff --git a/source/Classroom/Basics/Marketing_Campaigns/migrating_lists.md b/source/Classroom/Basics/Marketing_Campaigns/migrating_lists.md deleted file mode 100644 index 7af512d42a..0000000000 --- a/source/Classroom/Basics/Marketing_Campaigns/migrating_lists.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -seo: - title: Migrating Your Recipient Lists into Marketing Campaigns - description: Migrating Your Recipient Lists into Contacts - keywords: segmentation, marketing, newsletter, list, export, recipient, import, client, lists, migrate, customer, contacts, segment, move -title: Migrating Your Recipient Lists into Marketing Campaigns -weight: 0 -layout: page -zendesk_id: 206300138 -navigation: - show: true ---- - - - -Moving your Legacy Newsletter recipients to the Marketing Campaigns platform is an important part of the migration process. Our [Legacy Newsletter Migration Toolkit]({{root_url}}/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/index.html) provides detailed [step-by-step instructions]({{root_url}}/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_recipient_lists.html) explaining exactly how to migrate your recipients. diff --git a/source/Classroom/Basics/Marketing_Campaigns/migrating_unsubscribes.md b/source/Classroom/Basics/Marketing_Campaigns/migrating_unsubscribes.md deleted file mode 100644 index 140606a0e4..0000000000 --- a/source/Classroom/Basics/Marketing_Campaigns/migrating_unsubscribes.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -seo: - title: Migrating - description: Migrating Unsubscribes from Legacy Newsletter into Marketing Campaigns - keywords: drop, unsubscribe, unsub, export, import, migrate, asm, suppression -title: Migrating Unsubscribes from Legacy Newsletter into Marketing Campaigns -weight: 0 -layout: page -zendesk_id: 207009597 -navigation: - show: true ---- - - - -To continue to seamlessly honor the subscription preferences of your recipients as you migrate from Legacy Newsletter to Marketing Campaigns, you’ll need to manually migrate your Legacy Newsletter unsubscribes. Our Legacy Newsletter [Migration Toolkit]({{root_url}}/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/index.html) provides [detailed step-by-step instructions]({{root_url}}/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Migration/Migration_Tutorials/migrating_unsubscribes.html) on how to migrate these subscription preferences]. diff --git a/source/Classroom/Basics/Marketing_Campaigns/third_party_partner_marketing_campaigns_access.md b/source/Classroom/Basics/Marketing_Campaigns/third_party_partner_marketing_campaigns_access.md index 9e719892c0..443e62ab0a 100644 --- a/source/Classroom/Basics/Marketing_Campaigns/third_party_partner_marketing_campaigns_access.md +++ b/source/Classroom/Basics/Marketing_Campaigns/third_party_partner_marketing_campaigns_access.md @@ -13,4 +13,4 @@ navigation: show: true --- -[Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/index.html) is currently not available for customers using third party partner services such as Azure, Heroku, etc... Although the feature is visible on the dashboard, it is not accessable to third party partner accounts at this time. This is a feature we hope will be available in the future. +[Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/index.html) is currently not available for customers using third party partner services such as Azure, Heroku, etc... Although the feature is visible on the dashboard, it is not accessible to third party partner accounts at this time. This is a feature we hope will be available in the future. diff --git a/source/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.md b/source/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.md index cb275cf002..b1175ccaa8 100644 --- a/source/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.md +++ b/source/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.md @@ -51,7 +51,7 @@ Adding Your Unsubscribe Group to Your Campaign Once you've created your unsubscribe group, navigate to **Marketing** in the left hand nav and click **Campaigns**. -Select the campaign you want to add the group unsubscribe link to. Click **Edit** in the preview modal that appears or click the action cog and select **Edit** from the dropdown menu. +Select the campaign you want to add the group unsubscribe link to. Click **Edit** in the preview modal that appears or click the action menu and select **Edit** from the dropdown menu. Look for **Settings** in the left hand sidebar. Under the **Recipients** dropdown menu in this sidebar, select your unsubscribe group. @@ -79,7 +79,7 @@ Finally, click **Save** to save your campaign. Congratulations! You've now successfully added a group unsubscribe link to your campaign! If one of your recipients clicks this link in your campaign, they will be taken to a page SendGrid generates confirming that they have unsubscribed from this type, or group, of emails. -Of course, if they change their mind, they can always click “View Email Preferences” to see and manage which email groups they are subscribed to. +Of course, if they change their mind, they can always click “View Email Preferences” to see and manage which email groups they are opted out of. ![]({{root_url}}/images/mc_group_unsubscribes_5.png) @@ -101,7 +101,7 @@ Then, insert the text you would like to link to your custom unsubscribe page in Manage Email Preferences Links {% endanchor %} -While not required like an unsubscribe link, you can also add a “manage email preferences” link that will take your readers to a page where they can view all of the different types of email you send (your unsubscribe groups) and opt into or out of the various options. +While not required like an unsubscribe link, you can also add a “manage email preferences” link that will take your readers to a page where they can view all of the different types of email you send (your unsubscribe groups) and opt out of the various options. To add the manage preferences link, simply follow the steps described for the unsubscribe link. @@ -109,7 +109,7 @@ Then, in the body of your campaign, insert the text you would like to use for yo ![]({{root_url}}/images/mc_group_unsubscribes_6.png) -When your recipients click this link, they will be taken to an email preferences page SendGrid generates where they can opt into or out of the email groups you offer. +When your recipients click this link, they will be taken to an email preferences page SendGrid generates where they can opt out of the email groups you offer. {% info %} The Email Preferences page will only display the unsubscribe groups that you have marked as "default" in your unsubscribe group settings. diff --git a/source/Classroom/Basics/Misc/automated_ip_warmup.md b/source/Classroom/Basics/Misc/automated_ip_warmup.md deleted file mode 100644 index 151f77678c..0000000000 --- a/source/Classroom/Basics/Misc/automated_ip_warmup.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -st: - published_at: 2017-04-12 - type: Classroom -seo: - title: Automated IP Warmup Overview - description: Use the API to create IP pools, assign IP addresses to them, and enable IP warmup pools and IPs. - keywords: auto, automatic, warm, up, api, v3, ip, pool, warmup, pools -title: Automated IP Warmup Overview -weight: 0 -layout: page -navigation: - show: true ---- - -SendGrid can automatically warmup dedicated IP addresses by limiting the amount of mail that can be sent through them per hour, with the limit determined by how long the IP address has been in automated warmup. See the [automated warmup schedule]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.html) for more details. - -If you have existing warm IPs, as well as new IPs that need warming, any mail beyond the hourly maximum limit will overflow to your existing warm IPs. - -If there are no existing warm IPs, any requests made above the hourly maximum limit will overflow to our shared IP Warmup clusters for sending. If your sending reputation is below 85, you will not be able to use these Shared IP Warmup clusters. - -An IP in warmup will always follow SendGrid’s Warmup schedule. Please consider a measured approach when sending on a new IP to allow for proper IP warmup. - -You can read more on [the importance of warming up a new IP here]({{root_url}}/Classroom/Deliver/warming_up_ips.html). diff --git a/source/Classroom/Basics/Misc/sendgrid_oem_process.md b/source/Classroom/Basics/Misc/sendgrid_oem_process.md index 2be75da0fa..2c9e377bc5 100644 --- a/source/Classroom/Basics/Misc/sendgrid_oem_process.md +++ b/source/Classroom/Basics/Misc/sendgrid_oem_process.md @@ -16,12 +16,12 @@ navigation: SendGrid’s OEM process allows customers to use SendGrid’s service to send email on behalf of your customers, and can also include direct sending for your own business. -Typically this is achieved by utilizing our subuser functionality, where you create a parent account and then separate your customers into [subusers]({{root_url}}/User_Guide/Settings/Subusers/index.html): child accounts that belong to (and live within) a parent account. Subusers have their own permissions and sending limits, which you assign as you create them. For most customers who are sending email on behalf of their customers as an OEM, it's a great way to separate their users' data. It also gives you the ability to create a [domain whitelabel]({{root_url}}/User_Guide/Settings/Whitelabel/domains.html) for each of your customers, effectively masking SendGrid as the delivery engine for the end recipient, and you as the account owner if you choose. +Typically this is achieved by utilizing our subuser functionality, where you create a parent account and then separate your customers into [subusers]({{root_url}}/User_Guide/Settings/Subusers/index.html): child accounts that belong to (and live within) a parent account. Subusers have their own permissions and sending limits, which you assign as you create them. For most customers who are sending email on behalf of their customers as an OEM, it's a great way to separate their users' data. It also gives you the ability to [authenticate a domain]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) for each of your customers, effectively masking SendGrid as the delivery engine for the end recipient, and you as the account owner if you choose. # Why It Matters All SendGrid Pro and Premier level accounts have the ability to create subusers, but the number of potential subaccounts is initially capped at 15. -To become a SendGrid OEM customer, please contact our Customer Success team at [customersuccess@sendgrid.com](mailto:customersuccess@sendgrid.com). +To become a SendGrid OEM customer, please [fill out this form](https://sendgrid.com/contact-us-form/) to contact our Customer Success team. *NOTE:* _You are responsible for the sending practices of your customers using the SendGrid service on your account. This also applies to mitigations, content, delisting requests, support, and education for your clients. If you engage in direct sending of emails to your customers, you will also be responsible for your content and sending/data collection practices._ diff --git a/source/Classroom/Basics/Misc/support.md b/source/Classroom/Basics/Misc/support.md index 476294834a..515107dae9 100644 --- a/source/Classroom/Basics/Misc/support.md +++ b/source/Classroom/Basics/Misc/support.md @@ -9,6 +9,7 @@ layout: page navigation: show: true --- +
      diff --git a/source/Classroom/Basics/Misc/your_reputation_what_is_it.md b/source/Classroom/Basics/Misc/your_reputation_what_is_it.md index f7b85adab2..37b59bc29e 100644 --- a/source/Classroom/Basics/Misc/your_reputation_what_is_it.md +++ b/source/Classroom/Basics/Misc/your_reputation_what_is_it.md @@ -23,7 +23,8 @@ Please note that the SendGrid Reputation does not represent your inboxing percen The SendGrid account reputation is computed based on a calculation of: -- The percentage of requests that are able to be delivered out of the total amount requested (delivered / requests). This takes into account bounces, invalid emails, and drops (repeat bounces, unsubscribes, etc.) Please review our [Delivery Metrics](http://sendgrid.com/docs/Delivery_Metrics/index.html) article for more detail on these terms. +- The percentage of requests that are able to be delivered out of the total amount requested (delivered / requests). This takes into account bounces, invalid emails, and drops (repeat bounces, unsubscribes, etc.) Please review our [Statistics](https://sendgrid.com/docs/User_Guide/Statistics/index.html) article for more detail on these terms. + - Spam Reports. Each spam report is a user actively rejecting your mail, and has a strong negative affect. {% info %} diff --git "a/source/Classroom/Basics/Security/Icon\r" "b/source/Classroom/Basics/Security/Icon\r" deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/source/Classroom/Basics/Security/is_sendgrid_hipaa_compliant.md b/source/Classroom/Basics/Security/is_sendgrid_hipaa_compliant.md index 0db6eb9503..bef0096987 100644 --- a/source/Classroom/Basics/Security/is_sendgrid_hipaa_compliant.md +++ b/source/Classroom/Basics/Security/is_sendgrid_hipaa_compliant.md @@ -13,7 +13,7 @@ navigation: **No, we are not.** -SendGrid does not natively support HIPAA compliant data transmission. We do not offer any encryption or security measures surrounding message tranmission beyond those included in the SMTP RFC, which was not designed with HIPAA compliancy in mind. +SendGrid does not natively support HIPAA compliant data transmission. We do not offer any encryption or security measures surrounding message transmission beyond those included in the SMTP RFC, which was not designed with HIPAA compliancy in mind. We suggest that you encrypt the message body of your emails on your end if you are concerned about being complaint with HIPAA, or offer a secure download link for secure documents rather than transmitting them directly via email. diff --git a/source/Classroom/Basics/Security/keeping_your_registration_form_secure.md b/source/Classroom/Basics/Security/keeping_your_registration_form_secure.md index e9d68fa44a..086bc92734 100644 --- a/source/Classroom/Basics/Security/keeping_your_registration_form_secure.md +++ b/source/Classroom/Basics/Security/keeping_your_registration_form_secure.md @@ -13,7 +13,7 @@ navigation: Registration forms are a great way to follow up people’s interest in what you are offering on your website and with these tools you are able to make sure it is done right. Unfortunately, registration forms can be a large source of a sender acquiring bounced addresses and [Spam Traps]({{root_url}}/Classroom/Deliver/Undeliverable_Email/spam_trapped.html) which could cause your business to spam a host's mailbox without proper validation of addresses. This can reflect poorly in your SendGrid internal reputation as well as reflect poorly upon your business. Fortunately, there are many helpful techniques that can help a sender avoid many of the issue that can come up through their registration form. -Sometimes in the registration process, a person makes a mistake in entering their email such as person@domain.coom or person@@domain.com. By entering the email address twice and having a system in place that checks that the addresses match up, the person entering their email address has a much smaller chance of accidentally entering an invalid address. +Sometimes in the registration process, a person makes a mistake in entering their email such as example@example.com or person@@domain.com. By entering the email address twice and having a system in place that checks that the addresses match up, the person entering their email address has a much smaller chance of accidentally entering an invalid address. A good technique in protecting your registration form from bots is placing a required Captcha in the form: diff --git a/source/Classroom/Basics/Security/secure_upload_download_supression_lists.md b/source/Classroom/Basics/Security/secure_upload_download_supression_lists.md index 620373265a..dad0760cd1 100644 --- a/source/Classroom/Basics/Security/secure_upload_download_supression_lists.md +++ b/source/Classroom/Basics/Security/secure_upload_download_supression_lists.md @@ -4,8 +4,8 @@ st: type: Classroom seo: title: How can I securely upload or download lists of suppression addresses to SendGrid? - description: SendGrid offers secure channels for upload/download of supression lists. - keywords: transmit, download, upload,encrypted, encryption, files, documents, csv, list + description: SendGrid offers secure channels for upload/download of suppression lists. + keywords: transmit, download, upload, encrypted, encryption, files, documents, csv, list title: How can I securely upload or download lists of suppression addresses to SendGrid? weight: 0 layout: page diff --git a/source/Classroom/Basics/Security/security_checklist.md b/source/Classroom/Basics/Security/security_checklist.md index 29c2cc3a97..fa308d8131 100644 --- a/source/Classroom/Basics/Security/security_checklist.md +++ b/source/Classroom/Basics/Security/security_checklist.md @@ -9,28 +9,35 @@ layout: page navigation: show: true --- +Poor security practices put your reputation as a business and a sender at risk. Use these suggestions to improve the security of your system. -SendGrid doesn’t compromise when it comes to compromised accounts and neither should you. Every day that you put off security steps, your reputation as a business and a sender is at risk. Use these suggestions to improve the security of your system. +**1) Use a robust password!** -{% anchor h3 %} 1) Use a robust password! {% endanchor %} +Password Do’s +- Use upper and lower case letters, numerals, and special characters. +- Set up [Teammates](https://sendgrid.com/docs/User_Guide/Settings/teammates.html) to create, manage, and restrict additional sets of credentials to more precisely grant permissions within your SendGrid account. -- Don't use the same password for multiple sites, vary your passwords whenever possible. -- Use upper and lower case letters, numerals, and special characters. -- Don’t use easily guessable words or phrases such as personal information, your company name, or abbreviations. -- Don't expose your password on Github! +Password Don'ts +- Don’t use the same password for multiple sites. Vary your passwords whenever possible. +- Don’t use easily guessable words or phrases such as personal information, your company name, or abbreviations. +- Don’t expose your password on public repositories like Github, in the notes in the HTML on web pages, or on social media. -Set up Teammates to create, manage, and restrict additional sets of credentials to more precisely grant permissions within your SendGrid account. +**2) Don’t let web browsers automatically save your SendGrid password.** -{% anchor h3 %} 2) Don't let web browsers automatically save your SendGrid password. {% endanchor %} +**3) Perform regular virus scans on any computers that are used to send mail through SendGrid or are used login to your account.** -{% anchor h3 %} 3) Perform regular virus scans on any computers that are used to send mail through SendGrid or are used log in to your account. {% endanchor %} +**4) Encrypt and secure wireless connections.** -{% anchor h3 %} 4) Encrypt and secure wireless connections. {% endanchor %} +**5) Check for vulnerabilities in your web applications, and always make sure they are completely up to date.** -{% anchor h3 %} 5) Do not publicly display your SendGrid credentials in configuration files on Github, in the notes in the HTML on web pages, or on social media. {% endanchor %} + Software updates often fix vulnerabilities. For example, old versions of WordPress are vulnerable to exploitation. Review the [Harden WordPress](https://codex.wordpress.org/Hardening_WordPress) documentation that will introduce you to basic security concepts and serve as a guide to making your WordPress website more secure. -{% anchor h3 %} 6) Check for vulnerabilities in your web applications, and always make sure they are completely up to date - often, software updates fix vulnerabilities. For example, old versions of WordPress are vulnerable to exploitation. Review https://codex.wordpress.org/Hardening_WordPress to hardening your security with WordPress. {% endanchor %} - -{% anchor h3 %} 7) If you have a service that is sending emails through SendGrid, are there checks in place to prevent visitors (or bots) from sending email in large volumes or in any way that is abusive? If you have an email registration form, [here are some helpful tips]({{root_url}}/Classroom/Basics/Security/keeping_your_registration_form_secure.html) to keep your form secure. {% endanchor %} +**6) If you have a service that is sending emails through SendGrid, be sure there are checks in place to prevent visitors (or bots) from sending unwanted email in large volumes.** + + If you have an email registration form, [here are some helpful tips]({{root_url}}/Classroom/Basics/Security/keeping_your_registration_form_secure.html) to keep your form secure. + +{% warning %} +SendGrid will never send you an email asking you to provide you account password, API keys, or Credit/Debit Card information. Please report any account phishing attempts to abuse@sendgrid.com. +{% endwarning %} diff --git a/source/Classroom/Basics/Security/two_factor_authentication_faq.md b/source/Classroom/Basics/Security/two_factor_authentication_faq.md deleted file mode 100644 index e5a3ff7967..0000000000 --- a/source/Classroom/Basics/Security/two_factor_authentication_faq.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -seo: - title: Two-Factor Authentication FAQ - description: Find answers to commonly asked questions about our Two-Factor Authentication. - keywords: 2FA, Two-Factor Authentication, Authentication, login, multifactor authentication -title: Two-Factor Authentication FAQ -weight: 0 -layout: page -navigation: - show: true ---- - -* [What is Two-Factor Authentication?](#-What-is-TwoFactor-Authentication) -* [How is this release of Two-Factor Authentication different from the Legacy Two-Factor Authentication?](#-How-is-this-release-of-TwoFactor-Authentication-different-from-the-Legacy-TwoFactor-Authentication) -* [Can I get locked out of my account by using Two-Factor Authentication? If this happens, how can I regain access?](#-Can-I-get-locked-out-of-my-account-by-using-TwoFactor-Authentication-If-this-happens-how-can-I-regain-access) -* [Can I use Two-Factor Authentication with multiple user credentials?](#-Can-I-use-TwoFactor-Authentication-with-multiple-user-credentials) -* [Will my multiple user credentials be supported on Two-Factor Authentication?](#-Will-my-multiple-user-credentials-be-supported-on-TwoFactor-Authentication) -* [What happens if I repeatedly attempt to log in with an invalid token?](#-What-happens-if-I-repeatedly-attempt-to-log-in-with-an-invalid-token) - -{% anchor h2 %} -What is Two-Factor Authentication? -{% endanchor %} - -Two-Factor Authentication is a security feature that requires you to provide an additional 7-digit code generated by the [Authy App](https://www.authy.com/), or sent to your phone, whenever you log into your account. - -For more information on how you can get started using Two-Factor Authentication, please visit our [User Guide]({{root_url}}/User_Guide/Settings/two_factor_authentication.html). - -{% anchor h2 %} -How is this release of Two-Factor Authentication different from the previous version? -{% endanchor %} - -The previous version of Two-Factor Authentication would generate a 6-digit token delivered to your mobile device via SMS. You would then be required to submit this token to finish logging in. The functionality of the latest release of Two-Factor - -Authentication remains largely the same. However, it now supports the use of the [Authy App](https://www.authy.com/) to generate a 7-digit authentication token. - -**You may still resort to SMS if you encounter problems with the Authy App.** - -Furthermore, the latest Two-Factor Authentication release also allows you to create multiple configurations so that you can authenticate with more than one device. - -{% anchor h2 %} -Can I get locked out of my account by using Two-Factor Authentication? If this happens, how can I regain access? -{% endanchor %} - -It is possible to lock yourself out of your account when using Two-Factor Authentication. Here are a couple of situations to be aware of: - -* You lose your device configured with Authy, or your device runs out of power. -* You choose to only use SMS when retrieving authentication tokens, and you do not have cellular service. -* You choose to use Authy and SMS but have neither cellular service nor WiFi. -* You have a shared SendGrid account, but only one user has a mobile device configured with Two-Factor Authentication. - -If you find that you’ve lost access to your account as a result of Two-Factor Authentication, please reach out to the [Authy Support Team](https://www.authy.com/faq/). - -{% anchor h2 %} -Can I use Two-Factor Authentication with multiple user credentials? -{% endanchor %} - -You can create multiple configurations of Two-Factor Authentication, allowing you to use more than one mobile device to authenticate when logging into your account. However, you cannot create multiple, distinct Two-Factor Authentication configurations to be used by multiple credentialed users. - -The interaction between Two-Factor Authentication and multiple credentialed users has remained unchanged in the latest release. If Two-Factor Authentication is enabled and any multiple credentialed user attempts to log in, a notification will be triggered on the main credentialed user’s mobile device. - -{% anchor h2 %} -Will my multiple user credentials be supported on Two-Factor Authentication? -{% endanchor h2 %} - -Yes! Multiple user credentials can choose to have their own individual two-factor authentication. - -{% anchor h2 %} -What happens if I repeatedly attempt to log in with an invalid token? -{% endanchor %} - -You may make no more than 3 requests to log in per minute. If you exceed this rate limit, you will receive a 503 Error response. Multiple unsuccessful attempts to log in will result in locking your account for a brief period of time. This time period will increase in duration as you continue to make unsuccessful login attempts. diff --git a/source/Classroom/Basics/Security/what_security_measures_are_available_with_sendgrid_accounts.md b/source/Classroom/Basics/Security/what_security_measures_are_available_with_sendgrid_accounts.md index a8f32b58b5..651b5a0476 100644 --- a/source/Classroom/Basics/Security/what_security_measures_are_available_with_sendgrid_accounts.md +++ b/source/Classroom/Basics/Security/what_security_measures_are_available_with_sendgrid_accounts.md @@ -4,7 +4,7 @@ st: type: Classroom seo: title: SendGrid Security FAQs - description: What security measures are available with Sendgrid accounts? + description: What security measures are available with SendGrid accounts? keywords: security, policy, encryption, 2fa, soc2, hipaa, safe, harbor, compliance, compliant, disaster, recovery, type 2, vulnerability, exploit, privacy title: SendGrid Security FAQs weight: 0 diff --git a/source/Classroom/Basics/Whitelabel/index.html b/source/Classroom/Basics/Whitelabel/index.html deleted file mode 100644 index a1ccc36aaa..0000000000 --- a/source/Classroom/Basics/Whitelabel/index.html +++ /dev/null @@ -1,128 +0,0 @@ ---- -seo: - title: Whitelabeling Overview - description: A collection of our whitelabeling information and tutorials. - keywords: overview, index, whitelabeling, domain whitelabel, IP whitelabel, link whitelabel -title: Whitelabeling Overview -weight: 100 -layout: page -navigation: - show: true ---- - -Whitelabeling is the functionality that shows ISPs that SendGrid has your permission to send emails on your behalf. There are several different components that you can whitelabel: your sending domain, your dedicated IPs, and links to your websites and services. - -This page provides links to all of SendGrid's whitelabeling related documentation. You will find everything from FAQs and video tutorials to discussions of DKIM security. - -{% anchor h2 %} -Table of Contents -{% endanchor %} - - - -{% anchor h2 %} -Common Terms and Abbreviations -{% endanchor %} - -

      - Before you dive into our whitelabeling documentation, here are definitions of some common terms and acronyms associated with the whitelabeling process. -

      - - - -{% anchor h2 %} -Whitelabeling Introduction -{% endanchor %} - -

      - Here you will find several articles and FAQ pages introducing the whitelabeling process. -

      - - - -{% anchor h2 %} -Whitelabeling Tutorials -{% endanchor %} - -

      - Below are several step-by-step tutorials explaining exactly how to setup, configure, and maintain your whitelabels. -

      - - - -{% anchor h2 %} -Whitelabel User Guides -{% endanchor %} - -

      - Here you will find several reference pages providing general information about whitelabeling, and explanations of the various whitelabel settings. -

      - - - -{% anchor h2 %} -DNS -{% endanchor %} - -

      - Here are several articles discussing topics related to DNS (Domain Name System). -

      - - - -{% anchor h2 %} -DKIM, SPF, and DMARC -{% endanchor %} - -

      - Below are articles explaining DKIM, SPF, and DMARC. -

      - - diff --git a/source/Classroom/Basics/Whitelabel/link_whitelabels_explained.md b/source/Classroom/Basics/Whitelabel/link_whitelabels_explained.md deleted file mode 100644 index 17b8048283..0000000000 --- a/source/Classroom/Basics/Whitelabel/link_whitelabels_explained.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -st: - published_at: 2017-03-02 - type: Classroom -seo: - title: Email Link Whitelabels Explained - description: Why should I whitelabel my email links? - keywords: whitelabel, DNS, links -title: Email Link Whitelabels Explained -weight: 0 -layout: page -navigation: - show: true ---- - -{% anchor h2 %} -What are link whitelabels? -{% endanchor %} - -When you have click or open tracking turned on or put a link or an image that has been hyperlinked into an email, the click tracking links will be overwritten with SendGrid click tracking links. To prevent SendGrid from being displayed in your message headers or the HTML for your links, we recommend you whitelabel your email links. - -{% anchor h2 %} -Why should I whitelabel my links? -{% endanchor %} - -Some bad actors will use third party link shortening services to populate the domains they list in their email content and they do not include their own domain in those links and do this in an attempt to mask the true destination of the links. This practice is a red flag to spam filters and can negatively impact deliverability. - -By whitelabeling your links, you can improve the deliverability and legitimacy of your content by showing that you control it entirely. To learn more about link whitelabeling, please see our [links whitelabel documentation]({{root_url}}/User_Guide/Settings/Whitelabel/links.html). diff --git a/source/Classroom/Basics/Whitelabel/setup_domain_whitelabel.md b/source/Classroom/Basics/Whitelabel/setup_domain_whitelabel.md deleted file mode 100644 index 1680bb01f8..0000000000 --- a/source/Classroom/Basics/Whitelabel/setup_domain_whitelabel.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -st: - published_at: 2016-10-14 - type: Classroom -seo: - title: How to Setup a Domain Whitelabel - description: Learn how to setup a domain whitelabel - keywords: whitelabel, DKIM, SPF, CNAME, MX, TXT, domain whitelabel, domain, how to, tutorial -title: How to Setup a Domain Whitelabel -weight: 0 -layout: page -navigation: - show: true ---- - -Creating a domain whitelabel allows you to better authenticate the email that you send by removing the "sent via sendgrid.net" message that your recipients see on un-whitelabeled emails. This has the added benefit of giving you complete control over your sending reputation. - -Inbox providers distrust messages that are not properly whitelabeled, and you will not be able to begin building a positive reputation until you complete the whitelabeling process. - -{% anchor h2 %} -Creating a Domain Whitelabel -{% endanchor %} - -**(1)** Navigate to your SendGrid Dashboard, click **Settings** in the left hand sidebar, and select **Whitelabels**. - -**(2)** Under **Whitelabeled Domains**, Click **+Add Domain**. - -![]({{root_url}}/images/domain_whitelabel_setup_1.png) - -**(3)** If you have a subuser you would like create this whitelabel for, select that subuser now. Alternatively, you can create a whitelabel for your parent account and later assign that whitelabel to one of your subusers via subuser management. - -By assigning a domain whitelabel to one of your subusers, you can give them the benefit of improved authentication and security, whilst maintaining the reputation of your parent account. Furthermore, subusers may not edit or delete domain whitelabels assigned to them, making this a good option for OEM and reseller accounts. - -**(4)** Next, you need to specify the subdomain that you will use for your new domain whitelabel. Make sure that this subdomain is not used by any of your other sites or services. We recommend checking your current DNS settings with your DNS provider to confirm that the subdomain you would like to use is available. Try to pick a name for this subdomain that represents the type of email you will send using this new domain whitelabel. For example, "marketing" or "billing". - -![]({{root_url}}/images/domain_whitelabel_setup_2.png) - -{% warning %} -Your sending reputation will always be attributed to the reputation of your root, or top-level, domain. This is true even if you have several different subdomains with their domain whitelabels. For example, both **billing.example.com** and **marketing.example.com** will share the reputation of **example.com**. -{% endwarning %} - -We recommend that you avoid the use of underscores in your subdomain, since the DNS records that SendGrid creates are based off of your subdomain and many DNS providers will not accept DNS records that include underscores. We will cover this limitation in more detail in step 7. - -**(5)** Next, if you are creating a domain whitelabel on a new root domain, click **+Use New Domain** and enter the name of your new root domain. - -Make sure that you only enter the name of your root domain. **Do not** include `www.` or `http://www.` in this field! - -**Good:** - -![]({{root_url}}/images/domain_whitelabel_setup_3.png) - -**Bad:** - -![]({{root_url}}/images/domain_whitelabel_setup_4.png) - -**(6)** If you would like to set this new domain whitelabel as your default whitelabel, check the box next to **Default Whitelabel**. SendGrid will use your default whitelabel when no other valid whitelabels can be found. For more information on how SendGrid determines which whitelabel to use when delivering your email, click [here]({{root_url}}/User_Guide/Settings/Whitelabel/index.html#-Whitelabel-Application-Logic). - -**(7)** Finally, you can select whether or not you would like to enable **Automated Security** for your new domain whitelabel. SendGrid recommends using automated security since it will allow SendGrid to handle all of the [DKIM]({{root_url}}/Glossary/dkim.html) and [SPF]({{root_url}}/Glossary/spf.html) signing of your outbound email with CNAME records. This allows you to add dedicated IP addresses or upgrade your account without having to make any DNS changes. - -![]({{root_url}}/images/domain_whitelabel_setup_5.png) - -If you set **Automated Security** to **ON**, SendGrid will generate 3 different CNAME records that you will have to give to your DNS provider. - -If you set **Automated Security** to **OFF**, you will be provided with 1 MX record and 2 TXT records that you will have to give to your DNS provider. If your DNS provider does not accept underscores in CNAME records, you will have to turn off Automated Security to use MX and TXT records. - -**(8)** Finally, click **Save**. - -{% anchor h2 %} -Validating a Domain Whitelabel -{% endanchor %} - -Before you can begin to use your new domain whitelabel, you must submit the DNS records provided by SendGrid to your DNS or hosting provider. For more detailed instructions on how to add these records to some popular DNS providers, click [here]({{root_url}}/Classroom/Troubleshooting/Authentication/whitelabel_video_tutorials.html#Whitelabeling-with-GoDaddy). - -It can take up to 48 hours for these records to validate after creating them. - -![]({{root_url}}/images/domain_whitelabel_setup_6.png) - -Once you have entered your DNS records on your DNS provider's site, navigate back to your SendGrid Dashboard and go to your whitelabel settings. - -Under your new domain whitelabel, click **Validate Record**. - -**Remember:** if one or more of your DNS records fails to validate, you may need to wait longer for them to propagate. - -![]({{root_url}}/images/domain_whitelabel_setup_7.png) - -{% anchor h2 %} -Managing Your Domain Whitelabels -{% endanchor %} - -Once you have created and validated your domain whitelabel, there is little work you need to do to maintain it. - -Any time that you send email with a FROM address whose domain matches the domain of your new whitelabel, SendGrid will apply that whitelabel to your email. - -You can change a whitelabel's default status at any time by navigating to your whitelabel settings page, clicking the action cog next to your default whitelabel and clicking **Remove Default Status**. - -![]({{root_url}}/images/domain_whitelabel_setup_8.png) - -To delete one of your domain whitelabels, navigate to your whitelabel settings page, click to view the whitelabel you want to delete and click **Delete**. Alternatively, you can click the action cog next to your domain whitelabel and click **Delete**. - -{% anchor h2 %} -Related Resources -{% endanchor %} - -* [How to Setup an IP Whitelabel]({{root_url}}/Classroom/Basics/Whitelabel/setup_ip_whitelabel.html) -* [Whitelabel User Guide]({{root_url}}/User_Guide/Settings/Whitelabel/index.html) -* [Domain Whitelabel API Reference]({{root_url}}/API_Reference/Web_API_v3/Whitelabel/domains.html) -* [Whitelabel Video Tutorials]({{root_url}}/Classroom/Troubleshooting/Authentication/whitelabel_video_tutorials.html) diff --git a/source/Classroom/Basics/Whitelabel/setup_ip_whitelabel.md b/source/Classroom/Basics/Whitelabel/setup_ip_whitelabel.md deleted file mode 100644 index 3742a88acf..0000000000 --- a/source/Classroom/Basics/Whitelabel/setup_ip_whitelabel.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -st: - published_at: 2016-12-02 - type: Classroom -seo: - title: How to Setup an IP Whitelabel - description: Learn how to setup an IP whitelabel - keywords: whitelabel, A record, A, DKIM, SPF, CNAME, MX, TXT, IP whitelabel, IP, how to, tutorial -title: How to Setup an IP Whitelabel -weight: 0 -layout: page -navigation: - show: true ---- - -Much like [domain whitelabeling]({{root_url}}/Classroom/Basics/Whitelabel/setup_domain_whitelabel.html), IP whitelabeling provides an additional way to authenticate your email. When you send an email from a whitelabeled IP address, your recipients' inbox providers are able to verify that your IP address is authorized to send email on behalf of your domain. - -This is accomplished by performing a **reverse DNS lookup** (rDNS) using an **A Record** (address record) that SendGrid generates for your whitelabeled IP address. An A record simply maps a domain to an IP address. When a mailbox provider looks up your A Record, they will see your SendGrid IP address. When they look at your IP address, they will see the rDNS which will match with your A Record. This circular checking proves that your SendGrid IP is associated with your domain and that your domain is associated with your SendGrid IP. - -Whitelabeling an IP address is easy, and only requires that you update your DNS provider with a single DNS record. - -{% anchor h2 %} -Creating an IP Whitelabel -{% endanchor %} - -{% info %} -Only the parent account or a Teammate with the Whitelabel permission can create IP whitelabels; however, the parent account can assign the whitelabeled IP to subusers. -{% endinfo %} - -**(1)** Navigate to your SendGrid Dashboard, click **Settings** in the left hand sidebar, and select **Whitelabels**. - -**(2)** Under **Whitelabeled IPs**, click **+Add IP**. - -![]({{root_url}}/images/ip_whitelabel_setup_1.png) - -You will be shown a window containing a list of all of your IP addresses, the account they are assigned to, and their generic SendGrid rDNS information. - -**(3)** Select the IP address you want to whitelabel. - -**(4)** Under **Subdomain**, make sure to use the same subdomain that was used when whitelabeling that domain. - -**(5)** Select the domain that you would like to whitelabel this IP address to under the **Domain** drop down menu. - -![]({{root_url}}/images/ip_whitelabel_setup_2.png) - -{% info %} -An IP address can only be whitelabled to a single domain. However, you can whitelable multiple IP addresses to the same domain or different domains depending on your sending needs. -{% endinfo %} - -**(6)** Once you have entered the subdomain and selected the domain, click **Save**. - -**(7)** Click **Confirm** in the validation notification that appears. - -**(8)** You should be taken to the IP validation page where you can review the IP address being whitelabled, the user that this IP whitelabel will be assigned to, the updated rDNS information, and the A record that you will need to give your DNS provider. - -![]({{root_url}}/images/ip_whitelabel_setup_3.png) - -**(9)** Once you have given your new A Record to your DNS provider, and your provider propagates the changes, you can validate your IP whitelabel. - -**(10)** Your IP address is now associated with your sending domain via an A Record. Whenever your recipients' mailbox providers perform an rDNS check, they will see that your IP address matches the sending domain. If your rDNS doesn't match, many mailbox providers will reject your email. - -{% anchor h2 %} -Managing Your IP Whitelabels -{% endanchor %} - -{% anchor h3 %} -Adding an IP Address -{% endanchor %} - -Whenever you add a dedicated IP address to your account, you should make sure to whitelabel it by following the steps above. To add additional IPs to your Pro or Premier account, first, log into your account, and then click the **Add a Dedicated IP** button on the [Plan & Billing Details](https://app.sendgrid.com/settings/billing) page. - -{% anchor h3 %} -Deleting an IP Whitelabel -{% endanchor %} - -You can delete an IP whitelabel at any time. Simply navigating to your SendGrid dashboard, click **Settings** in the lefthand sidebar, and click **IPs** under **Whitelabels**. You will see a list of your IP whitelabels. Click the action cog next to the whitelabel you want to delete and click **Delete**. - -{% warning %} -Deleting an IP whitelabel is permanent! You cannot recover a deleted IP whitelabel. - -Deleting an IP whitelabel from SendGrid will not remove that IP's A record from your DNS provider's settings. After you delete an IP whitelabel, make sure to go to your DNS host's DNS settings to remove the associated A record. -{% endwarning %} diff --git a/source/Classroom/Basics/Whitelabel/subuser_whitelabels.md b/source/Classroom/Basics/Whitelabel/subuser_whitelabels.md deleted file mode 100644 index c8c23ca696..0000000000 --- a/source/Classroom/Basics/Whitelabel/subuser_whitelabels.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -st: - published_at: 2017-02-13 - type: Classroom -seo: - title: Creating Whitelabels for Subusers - description: All you need to know about creating a whitelabel for a subuser, assigning a whitelabel to a subuser, and managing subusers' whitelabels! - keywords: subuser, whitelabel, domain whitelabel, ip whitelabel, domain, ip, assign, associate, update -title: Creating Whitelabels for Subusers -weight: 0 -layout: page -navigation: - show: true ---- - -{% anchor h2 %} -Table of Contents -{% endanchor %} - -* [What is whitelabeling?](#-What-is-whitelabeling) -* [What are the benefits of whitelabeling subusers?](#-What-are-the-benefits-of-whitelabeling-subusers) -* [Creating subuser whitelabels](#-Creating-Subuser-Whitelabels) -* [Creating a subuser whitelabel from the parent account](#-Creating-a-Subuser-Whitelabel-from-the-Parent-Account) - * [Assigning a whitelabel to a subuser](#-Assigning-a-whitelabel-to-a-subuser) - * [Whitelabeling on behalf of a subuser](#-Whitelabeling-on-behalf-of-a-subuser) -* [Creating a subuser whitelabel from the subuser account](#-Creating-a-Whitelabel-from-the-Subuser-Account) - -{% anchor h2 %} -What is whitelabeling? -{% endanchor %} - -![]({{root_url}}/images/subuser_whitelabel_1.png) - -Whitelabeling allows you to better authenticate the email you send from your SendGrid parent or subuser account. - -Before whitelabeling, all of your outbound emails will be marked as "mailed-by" and "sent-by" sendgrid.com. Any links in your emails with click tracking enabled will include sendgrid.net in the URL and the rDNS information for your sending IP address will point to SendGrid instead of your own domain. - -While users sending through SendGrid without a whitelabel can still expect a very high delivery rate, whitelabeling is the best thing you can do to begin building trust with your recipients' inbox providers. - -The benefits of whitelabeling extend beyond pleasing inbox providers: creating IP, link and domain whitelabels will help you develop brand consistency and domain alignment— the domain in your FROM address will match the domain in the Return-Path, the domain in the DKIM signature, and the domain that your sending IP addresses point to. - -{% anchor h3 %} -Where can I find more information about whitelabeling? -{% endanchor %} - -* [Step-by-step instructions for creating a domain whitelabel]({{root_url}}/Classroom/Basics/Whitelabel/setup_domain_whitelabel.html) -* [Step-by-step instructions for creating an IP whitelabel]({{root_url}}/Classroom/Basics/Whitelabel/setup_ip_whitelabel.html) -* [Detailed information and step-by-step video tutorial for creating a link whitelabel]({{root_url}}/User_Guide/Settings/Whitelabel/links.html) - -You can find all of our whitelabel video tutorials [here]({{root_url}}/Classroom/Troubleshooting/Authentication/whitelabel_video_tutorials.html#Whitelabeled-Domains). - -{% anchor h2 %} -What are the benefits of whitelabeling subusers? -{% endanchor %} - -You should always strive to build and maintain a positive sender reputation. The sending reputation of your subuser accounts is just as important as the reputation of your parent account. - -{% info %} -Whitelabeling your parent account will not benefit the reputations of your subusers. To improve your subusers' reputations, you must create for them, or encourage them to create, their own whitelabels. -{% endinfo %} - -If you have multiple unrelated subusers who send different types of email, providing each subuser with their own whitelabel is an easy way to separate their sending reputations. - -{% anchor h2 %} -Creating Subuser Whitelabels -{% endanchor %} - -There are three ways to create a subuser whitelabel: - -1. You can create a whitelabel from your parent account, and then **[assign that whitelabel to a subuser](#-Assigning-a-whitelabel-to-a-subuser)** via [subuser management](https://app.sendgrid.com/settings/subusers). -2. You can [create a whitelabel on behalf of a subuser](#-Whitelabeling-on-behalf-of-a-subuser) from your parent account— connecting that whitelabel with the subuser. -3. If you are a subuser, you may [create and manage your own whitelabel](#-Creating-a-Whitelabel-from-the-Subuser-Account) if the parent account has not already assigned you a whitelabel. - -Below you will find step-by-step instructions explaining each of these two options, along with a discussion of the pros and cons of each option. - -{% info %} -The steps described below illustrate the processes of creating a subuser whitelabel for your **sending domain**. However, the same steps may be followed for link whitelabels. -{% endinfo %} - -{% anchor h2 %} -Creating a Subuser Whitelabel from the Parent Account -{% endanchor %} - -{% anchor h3 %} -Benefits of whitelabeling a subuser from the parent account -{% endanchor %} - -Whitelabels created by the parent account and assigned to a subuser can not be edited by the subuser. This is a secure and safe method that provides the parent account with more control over subusers' whitelabels. - -{% warning %} -While subusers cannot modify whitelabels assigned or connected to them, they can still create their own whitelabel which would overwrite the whitelabel assigned or connected to them by the parent account. -{% endwarning %} - -{% anchor h3 %} -Assigning a whitelabel to a subuser -{% endanchor %} - -Before you can assign a whitelabel to a subuser, you must first create the whitelabel on your parent account. **Creating a domain whitelabel from your parent account is explained in detail [here]({{root_url}}/Classroom/Basics/Whitelabel/setup_domain_whitelabel.html).** - -After you have created your new whitelabel, navigate to your [Subuser Management page](https://app.sendgrid.com/settings/subusers) from the left hand side bar. Click on the subuser you would like to assign a whitelabel to. - -Next to the **Whitelabel Domain** and **Whitelabel Link** options, click **Change Sending**. - -![]({{root_url}}/images/subuser_whitelabel_2.png) - -Next, select the whitelabel you would like to assign to the subuser from either the **Select a whitelabel domain** or the **Select a whitelabel link** dropdown menu depending on the type of whitelabel you want to assign. - -![]({{root_url}}/images/subuser_whitelabel_3.png) - -Finally, click **Save**. You should see the new whitelabel listed under either **Whitelabel Domain** or **Whitelabel Link**, depending on which whitelabel you chose. - -![]({{root_url}}/images/subuser_whitelabel_4.png) - -{% anchor h3 %} -Whitelabeling on behalf of a subuser -{% endanchor %} - -When creating your new whitelabel you are presented with a window where you specify the subdomain and domain of your new whitelabel. Above these fields, you will see a dropdown menu titled **ON BEHALF OF USER**. - -To create a whitelabel for a specific subuser, select that subuser from this dropdown menu. You are connecting this whitelabel with this subuser and **only this subuser** will be able to use this whitelabel. - -![]({{root_url}}/images/subuser_whitelabel_5.png) - -**The remainder of the steps to create a domain whitelabel are explained [here]({{root_url}}/Classroom/Basics/Whitelabel/setup_domain_whitelabel.html).** - -{% anchor h2 %} -Creating a Whitelabel from the Subuser Account -{% endanchor %} - -The steps for creating a whitelabel as a subuser are no different from those for a parent account. - -**Step-by-step instructions explaining how to create a domain whitelabel can be found [here]({{root_url}}/Classroom/Basics/Whitelabel/setup_domain_whitelabel.html).** - -{% warning %} -If a parent account has already assigned or connected a whitelabel with your account, any new whitelabel that you create will overwrite the previous whitelabel if it is set as default. -{% endwarning %} - -{% anchor h3 %} -Benefits of whitelabeling from a subuser account or on behalf of a subuser -{% endanchor %} - -{% anchor h4 %} -SPF record benefits -{% endanchor %} - -Currently, SendGrid only will include up to 11 different IP addresses in an SPF record before we resort to using *sendgrid.net ~all*. - -However, it is easy to ensure that the SPF record for a subuser includes only IP addresses assigned to that subuser. Simply create a whitelabel from the subuser account, or create a whitelabel *on behalf* of a subuser from the parent account. - -{% anchor h4 %} -DKIM key benefits -{% endanchor %} - -DKIM keys are specific to each SendGrid user. So, multiple whitelabels created by a parent SendGrid account will all share the same DKIM Key. - -To ensure that your subuser has their own unique DKIM Key, create a whitelabel from the subuser account or create the whitelabel *on behalf* of that subuser from the parent account. - -{% info %} -We recommend that OEM SendGrid users create whitelabels for their subusers **on** their subusers account or create the whitelabel *on behalf of* that subuser from the parent account. This will ensure that each subuser has their own DKIM Key and will prevent subusers from impersonating each other. -{% endinfo %} diff --git a/source/Classroom/Basics/Whitelabel/whitelabel_vs_whitelist.md b/source/Classroom/Basics/Whitelabel/whitelabel_vs_whitelist.md deleted file mode 100644 index 54086c309f..0000000000 --- a/source/Classroom/Basics/Whitelabel/whitelabel_vs_whitelist.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -st: - published_at: 2017-03-02 - type: Classroom -seo: - title: Whitelabel vs. Whitelist - description: What is the difference between whitelabeling and whitelisting? - keywords: whitelabel, whitelist, IP, DNS -title: Whitelabel vs. Whitelist -weight: 0 -layout: page -navigation: - show: true ---- - -The terms _whitelabel_ and _whitelist_ are often mistakenly interchanged, but they have two very different definitions and are associated with two very different uses. - -Whitelabeling refers to the process of showing ISPs that SendGrid has your permission to send emails on your behalf. This is achieved by adding DNS records to your hosting service. These DNS records associate your sending domain with SendGrid— when an inbox provider processes your email, they will see your domain instead of `sendgrid.net`. This process can also be performed for the links in your email as well as dedicated IP addresses associated with your account (available with Pro level or higher accounts). You can learn more about whitelabeling, and how to set it up, by checking out our [whitelabel documentation]({{root_url}}/User_Guide/Settings/Whitelabel/index.html). - -[Whitelisting]({{root_url}}/Glossary/whitelist.html) refers to the process of granting a particular IP address access to a server or system. SendGrid's IP Access Management is one example of whitelisting. IP Access Management is a security feature that allows you to control who can access your SendGrid account based on their IP address. - -You can learn more about IP Access Management Documentation [here]({{root_url}}/User_Guide/Settings/ip_access_management.html). - -You may also hear the term whitelist when referring to a list of IP addresses that receive special treatment when sending mail to a specific inbox provider. Email whitelists are becoming less and less common. These days, the best way to ensure your messages land in the inbox is to send mail that you know your recipients will love. - -{% info %} -IP Access Management has very specific use cases and we strongly recommended that you read through our [documentation]({{root_url}}/User_Guide/Settings/ip_access_management.html). -{% endinfo %} diff --git a/source/Classroom/Basics/index.html b/source/Classroom/Basics/index.html index fe1aff1945..52a25bb5a0 100644 --- a/source/Classroom/Basics/index.html +++ b/source/Classroom/Basics/index.html @@ -17,7 +17,7 @@

      Account

      API

      -
    diff --git a/source/Classroom/Build/Add_Content/change_email_content_after_send.md b/source/Classroom/Build/Add_Content/change_email_content_after_send.md index df5932ca55..4f13d4e982 100644 --- a/source/Classroom/Build/Add_Content/change_email_content_after_send.md +++ b/source/Classroom/Build/Add_Content/change_email_content_after_send.md @@ -13,4 +13,4 @@ navigation: show: true --- -As it turns out, there is not a way to alter the content of your messages once an email is sent. A good practice that you can put into place is to send a test copy before sending your content out to your recipieints. Alternatively, there are services such as [Litmus](https://litmus.com/) you can use that can help you get an idea of how your content will appear when sent to various browsers. +As it turns out, there is not a way to alter the content of your messages once an email is sent. A good practice that you can put into place is to send a test copy before sending your content out to your recipients. Alternatively, there are services such as [Litmus](https://litmus.com/) you can use that can help you get an idea of how your content will appear when sent to various browsers. diff --git a/source/Classroom/Build/Add_Content/content_delivery_networks.md b/source/Classroom/Build/Add_Content/content_delivery_networks.md index d23a2dc139..347f1f61f3 100644 --- a/source/Classroom/Build/Add_Content/content_delivery_networks.md +++ b/source/Classroom/Build/Add_Content/content_delivery_networks.md @@ -18,13 +18,13 @@ Using CloudFlare The following instructions assume you already have a CloudFlare account made, using either a [Full DNS setup](https://support.cloudflare.com/hc/en-us/articles/205195708) or a [CNAME setup](https://support.cloudflare.com/hc/en-us/articles/200168706). You can compare the two different setups [here](https://support.cloudflare.com/hc/en-us/articles/203685674). Note that a CNAME setup is only available to Business or Enterprise level CloudFlare plans. -The instructions also assume that you have set up a valid [email links whitelabel](https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/links.html) on your account. This step is essential for the following instructions to work. +The instructions also assume that you have set up a valid [branded link](https://sendgrid.com/docs/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) on your account. This step is essential for the following instructions to work. Begin by logging into your CloudFlare account, and navigating to the DNS settings for your domain. ![CloudFlare DNS Settings]({{root_url}}/images/cloudflare1.png) -Add a new CNAME entry that points your configured Email Links WhiteLabel domain to sendgrid.net. +Add a new CNAME entry that points your configured branded link domain to sendgrid.net. ![CloudFlare DNS Addition]({{root_url}}/images/cloudflare2.png) @@ -32,7 +32,7 @@ Once the record is created, click on the cloud icon under the Status column to t ![CloudFlare DNS HTTP proxy]({{root_url}}/images/cloudflare3.png) -Next, navigate to the Page Rules settings for your domain. You will need to create a Page Rule for your Email Links Whitelabel domain that sets SSL to Full. This is necessary due to how [CloudFlare validates the certificate on the origin](https://support.cloudflare.com/hc/en-us/articles/200721975). You can find more information on the different SSL options [here](https://support.cloudflare.com/hc/en-us/articles/200170416). +Next, navigate to the Page Rules settings for your domain. You will need to create a Page Rule for your branded link domain that sets SSL to Full. This is necessary due to how [CloudFlare validates the certificate on the origin](https://support.cloudflare.com/hc/en-us/articles/200721975). You can find more information on the different SSL options [here](https://support.cloudflare.com/hc/en-us/articles/200170416). ![CloudFlare Page Rules Addition]({{root_url}}/images/cloudflare4.png) @@ -55,7 +55,7 @@ Using Fastly Set the options as follows: * **Server address and port:** `sendgrid.net` : `443` _The connection on the SSL port 443_ -* **Domain:** `email.example.com` _Enter your links whitelabel domain here. Ensure it matches the domain configured in the SendGrid whitelabel settings. This value will be what recipients see in your SSL enabled click tracking links._ +* **Domain:** `email.example.com` _Enter your branded link domain here. Ensure it matches the domain configured in the SendGrid link branding settings. This value will be what recipients see in your SSL enabled click tracking links._ * **Description:** `SendGrid` (or whatever you like) Finally, click the **Create**. The new service will appear in the list of available services. @@ -87,7 +87,7 @@ Enable the option "Forward Host Header." ![KeyCDN Forward Host Header]({{root_url}}/images/keycdn3.png) -Add the Zonealias (with the alias you want to use for your email links whitelabel domain) +Create a CNAME record in your DNS settings pointing the alias you want to use for your email branded link domain (e.g. email.domain.com) to the Zone URL provided within your KeyCDN dashboard (e.g. sendgrid-1c6b.kxcdn.com). Then, add that alias as a Zonealias. ![KeyCDN Zonealias]({{root_url}}/images/keycdn4.png) diff --git a/source/Classroom/Build/Add_Content/custom_ssl_configurations.md b/source/Classroom/Build/Add_Content/custom_ssl_configurations.md new file mode 100644 index 0000000000..5919f89ee1 --- /dev/null +++ b/source/Classroom/Build/Add_Content/custom_ssl_configurations.md @@ -0,0 +1,28 @@ +--- +seo: + title: Adding a Custom SSL configuration +title: Adding a Custom SSL configuration +layout: page +weight: 0 +navigation: + show: true +--- + +If you can't or don't want to use Content Delivery Networks when setting up SSL for click and open tracking, then you can setup custom SSL configuration. + +Before Adding a Custom SSL configuration, you need to set up a valid [link branding](https://sendgrid.com/docs/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) on your account like this: + +![Email Links Whitelabel]({{root_url}}/images/email_link_whitelabel.png) + +*To add a custom SSL configuration:* + +1. Prepare a proxy (like web application, nginx, or Amazon API Gateway) to take all traffic for `mailing.example.com` and forward it to `sendgrid.net`. +1. Set up the proxy to use HTTP or HTTPS. For HTTPS, provide valid SSL certificate for `mailing.example.com` domain. +1. To forward traffic, set `Host` HTTP header to `mailing.example.com` domain. +1. Point the CNAME record to your proxy. For example, `CNAME mailing.example.com proxy.example.com`. + +{% warning %} +Don't validate the DNS record more than once, because after changing the CNAME, a second validation fails and the authentication stops working. +{% endwarning %} + +[Contact SendGrid Support](https://support.sendgrid.com/hc/en-us) to enable SSL click and open tracking. diff --git a/source/Classroom/Build/Add_Content/embedding_videos_in_your_emails.md b/source/Classroom/Build/Add_Content/embedding_videos_in_your_emails.md index 2b2750fff9..0ee0c17fcf 100644 --- a/source/Classroom/Build/Add_Content/embedding_videos_in_your_emails.md +++ b/source/Classroom/Build/Add_Content/embedding_videos_in_your_emails.md @@ -27,7 +27,7 @@ Aside from these videos simply not being supported by most mail clients, the nex ## OUR VERDICT -**Do not embed videos**. As we discussed, videos are rarely, if ever, supported by the mail client without the use of plugins, and inbox trends have shown that emails containing embedded videos are all too often labeled as spam or junk. If you absolutely have to embed a video then you should make sure to segment your lists based on the mail clients which support video, then embed the video specific to the calls that the mail client can support. +**Do not embed videos**. As we discussed, videos are rarely, if ever, supported by the mail client without the use of plugins, and inbox trends have shown that emails containing embedded videos are all too often labeled as spam or junk. If you absolutely have to embed a video then you should make sure to segment your lists based on the mail clients which support video, then embed the video specific to the calls that the mail client can support. GIFs are supported by most mail clients, so if the need is there then experimenting in that format is usually much safer. In the Support Team's opinion, the easiest and most reliable way to share a video with a recipient is to simply place a link in your email body that redirects the recipient to the original video. diff --git a/source/Classroom/Build/Add_Content/how_do_i_add_a_list_unsubscribe_header_to_my_emails.md b/source/Classroom/Build/Add_Content/how_do_i_add_a_list_unsubscribe_header_to_my_emails.md index baf9929c45..eef4ae0991 100644 --- a/source/Classroom/Build/Add_Content/how_do_i_add_a_list_unsubscribe_header_to_my_emails.md +++ b/source/Classroom/Build/Add_Content/how_do_i_add_a_list_unsubscribe_header_to_my_emails.md @@ -11,7 +11,7 @@ navigation: show: true --- -We do it automatically! By simply enabling the [Subscription Tracking](https://app.sendgrid.com/settings/tracking) setting in your account, we'll include a list-unsubscribe header in any messages you send. +We do it automatically! By simply enabling the [Subscription Tracking](https://app.sendgrid.com/settings/tracking) setting in your account, we'll include a list-unsubscribe header in any messages you send. For more information about the list-unsubscribe header, and why it is awesome, check out http://www.list-unsubscribe.com/ diff --git a/source/Classroom/Build/Add_Content/substitution_and_section_tags.md b/source/Classroom/Build/Add_Content/substitution_and_section_tags.md index 3062d430cc..a108b2c7ff 100644 --- a/source/Classroom/Build/Add_Content/substitution_and_section_tags.md +++ b/source/Classroom/Build/Add_Content/substitution_and_section_tags.md @@ -12,9 +12,37 @@ navigation: --- {% anchor h2 %} -Simple Substitution +Simple Name Substitution {% endanchor %} +This example will show you how to create a name substitution for your emails. We will be using the tag {% raw %}{{name}}{% endraw %} in this example. In this example the tag {% raw %}{{name}}{% endraw %} will get replaced with the name of the recipient. + +{% anchor h3 %} +Email Content +{% endanchor %} + +{% anchor h4 %} +Text +{% endanchor %} + +{% codeblock %} +Hello {% raw %}{{name}}{% endraw %}, +{% endcodeblock %} + +{% anchor h4 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello {% raw %}{{name}}{% endraw %},
    +

    + + +{% endcodeblock %} + {% anchor h3 %} X-SMTPAPI Header {% endanchor %} @@ -27,19 +55,11 @@ X-SMTPAPI Header "example03@domain.com" ], "sub": { - "-name-": ["John", "Jane", "Matt"] + "{% raw %}{{name}}{% endraw %}": ["John", "Jane", "Matt"] } } {% endcodeblock %} -{% anchor h3 %} -Email Content -{% endanchor %} - -{% codeblock %} -Hello -name-, -{% endcodeblock %} - {% anchor h3 %} v3 Mail Send {% endanchor %} @@ -53,7 +73,7 @@ v3 Mail Send }], "subject": "Example 01", "substitutions": { - "-name-": "John" + "{% raw %}{{name}}{% endraw %}": "John" } }, { "to": [{ @@ -62,7 +82,7 @@ v3 Mail Send }], "subject": "Example 02", "substitutions": { - "-name-": "Jane" + "{% raw %}{{name}}{% endraw %}": "Jane" } }, { "to": [{ @@ -71,7 +91,7 @@ v3 Mail Send }], "subject": "Example 03", "substitutions": { - "-name-": "Matt" + "{% raw %}{{name}}{% endraw %}": "Matt" } }], "from": { @@ -85,19 +105,129 @@ v3 Mail Send "subject": "Example", "content": [{ "type": "text/plain", - "value": "Hello -name-," + "value": "Hello {% raw %}{{name}}{% endraw %}," }, { "type": "text/html", - "value": "Hello -name-," + "value": "Hello {% raw %}{{name}}{% endraw %}," }] } {% endcodeblock %} +{% anchor h3 %} +Example Outcome: +{% endanchor %} + +{% anchor h4 %} +example01@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello John, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello John,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example02@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Jane, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Jane,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example03@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Matt, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Matt,
    +

    + + +{% endcodeblock %} + {% anchor h2 %} -Double Substitution +First Name and Last Name Substitutions +{% endanchor %} + +This example will show you how to create a first name and last name substitution for your emails. We will be using the tags "{% raw %}{{first_name}}{% endraw %}" and "{% raw %}{last_name}}{% endraw %}" in this example. In this example the tag {% raw %}{{first_name}}{% endraw %} will get replaced with the first name of the recipient and the tag {% raw %}{{last_name}}{% endraw %} will get replaced with the last name of the recipient. + +{% anchor h3 %} +Email Content +{% endanchor %} + +{% anchor h4 %} +Text +{% endanchor %} + +{% codeblock %} +Hello {% raw %}{{first_name}}{% endraw %} {% raw %} {{last_name}}{% endraw %}, +{% endcodeblock %} + +{% anchor h4 %} +HTML {% endanchor %} +{% codeblock lang:html %} + + + +

    Hello {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %},
    +

    + + +{% endcodeblock %} + {% anchor h3 %} X-SMTPAPI Header {% endanchor %} @@ -110,20 +240,12 @@ X-SMTPAPI Header "example03@domain.com" ], "sub": { - "-first_name-": ["John", "Jane", "Matt"], - "-last_name-": ["Smith", "Williams", "Johnson"] + "{% raw %}{{first_name}}{% endraw %}": ["John", "Jane", "Matt"], + "{% raw %}{{last_name}}{% endraw %}": ["Smith", "Williams", "Johnson"] } } {% endcodeblock %} -{% anchor h3 %} -Email Content -{% endanchor %} - -{% codeblock %} -Hello -first_name- -last_name-, -{% endcodeblock %} - {% anchor h3 %} v3 Mail Send {% endanchor %} @@ -137,8 +259,8 @@ v3 Mail Send }], "subject": "Example 01", "substitutions": { - "-first_name-": "John", - "-last_name-": "Smith" + "{% raw %}{{first_name}}{% endraw %}": "John", + "{% raw %}{{last_name}}{% endraw %}": "Smith" } }, { "to": [{ @@ -147,8 +269,8 @@ v3 Mail Send }], "subject": "Example 02", "substitutions": { - "-first_name-": "Jane", - "-last_name-": "Williams" + "{% raw %}{{first_name}}{% endraw %}": "Jane", + "{% raw %}{{last_name}}{% endraw %}": "Williams" } }, { "to": [{ @@ -157,8 +279,8 @@ v3 Mail Send }], "subject": "Example 03", "substitutions": { - "-first_name-": "Matt", - "-last_name-": "Johnson" + "{% raw %}{{first_name}}{% endraw %}": "Matt", + "{% raw %}{{last_name}}{% endraw %}": "Johnson" } }], "from": { @@ -172,19 +294,129 @@ v3 Mail Send "subject": "Example", "content": [{ "type": "text/plain", - "value": "Hello -first_name- -last_name-," + "value": "Hello {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %}," }, { "type": "text/html", - "value": "Hello -first_name- -last_name-," + "value": "Hello {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %}," }] } {% endcodeblock %} +{% anchor h3 %} +Example Outcome: +{% endanchor %} + +{% anchor h4 %} +example01@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello John Smith, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello John Smith,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example02@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Jane Williams, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Jane Williams,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example03@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Matt Johnson, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Matt Johnson,
    +

    + + +{% endcodeblock %} + {% anchor h2 %} -Simple Section and Substitution +Simple Greeting Section with Name Substitution +{% endanchor %} + +This example will show you how to create a section as a greeting with a name substitution. We will be using the tags "{% raw %}{{warm_welcome}}{% endraw %}", "{% raw %}{{greeting}}{% endraw %}" and "{% raw %}{{name}}{% endraw %}" in this example. In this example we have created a greeting using the section tag {% raw %}{{warm_welcome}}{% endraw %}. The {% raw %}{{warm_welcome}}{% endraw %} tag is replaced with the {% raw %}{{greeting}}{% endraw %} substitution which calls the section "Hello {% raw %}{{name}}{% endraw %},". The {% raw %}{{name}}{% endraw %} tag in "Hello {% raw %}{{name}}{% endraw %}," is then replaced with the recipients name. + +{% anchor h3 %} +Email Content +{% endanchor %} + +{% anchor h4 %} +Text +{% endanchor %} + +{% codeblock %} +{% raw %}{{warm_welcome}}{% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +HTML {% endanchor %} +{% codeblock lang:html %} + + + +

    {% raw %}{{warm_welcome}}{% endraw %}
    +

    + + +{% endcodeblock %} + {% anchor h3 %} X-SMTPAPI Header {% endanchor %} @@ -197,23 +429,15 @@ X-SMTPAPI Header "example03@domain.com" ], "sub": { - "-name-": ["John", "Jane", "Matt"], - "-warm_welcome-": ["-greeting-", "-greeting-", "-greeting-"] + "{% raw %}{{name}}{% endraw %}": ["John", "Jane", "Matt"], + "{% raw %}{{warm_welcome}}{% endraw %}": ["{% raw %}{{greeting}}{% endraw %}", "{% raw %}{{greeting}}{% endraw %}", "{% raw %}{{greeting}}{% endraw %}"] }, "section": { - "-greeting-": "Hello -name-," + "{% raw %}{{greeting}}{% endraw %}": "Hello {% raw %}{{name}}{% endraw %}," } } {% endcodeblock %} -{% anchor h3 %} -Email Content -{% endanchor %} - -{% codeblock %} --warm_welcome- -{% endcodeblock %} - {% anchor h3 %} v3 Mail Send {% endanchor %} @@ -227,8 +451,8 @@ v3 Mail Send }], "subject": "Example 01", "substitutions": { - "-name-": "John", - "-warm_welcome-": "-greeting-" + "{% raw %}{{name}}{% endraw %}": "John", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting}}{% endraw %}" } }, { "to": [{ @@ -237,8 +461,8 @@ v3 Mail Send }], "subject": "Example 02", "substitutions": { - "-name-": "Jane", - "-warm_welcome-": "-greeting-" + "{% raw %}{{name}}{% endraw %}": "Jane", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting}}{% endraw %}" } }, { "to": [{ @@ -247,8 +471,8 @@ v3 Mail Send }], "subject": "Example 03", "substitutions": { - "-name-": "Matt", - "-warm_welcome-": "-greeting-" + "{% raw %}{{name}}{% endraw %}": "Matt", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting}}{% endraw %}" } }], "from": { @@ -262,21 +486,131 @@ v3 Mail Send "subject": "Example", "content": [{ "type": "text/plain", - "value": "-warm_welcome-" + "value": "{% raw %}{{warm_welcome}}{% endraw %}" }, { "type": "text/html", - "value": "-warm_welcome-" + "value": "{% raw %}{{warm_welcome}}{% endraw %}" }], "sections": { - "-greeting-": "Welcome -name-," + "{% raw %}{{greeting}}{% endraw %}": "Welcome {% raw %}{{name}}{% endraw %}," } } {% endcodeblock %} +{% anchor h3 %} +Example Outcome: +{% endanchor %} + +{% anchor h4 %} +example01@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello John, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello John,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example02@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Jane, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Jane,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example03@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Matt, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Matt,
    +

    + + +{% endcodeblock %} + {% anchor h2 %} -Double Substitution with Section +Greeting Section with First & Last Name Substitutions {% endanchor %} +This example will show you how to create a section with first name and last name substitution for your emails. We will be using the tags "{% raw %}{{warm_welcome}}{% endraw %}", "{% raw %}{{greeting}}{% endraw %}", "{% raw %}{{first_name}}{% endraw %}" and "{% raw %}{{last_name}}{% endraw %}" in this example. In this example we have created a greeting using the section tag {% raw %}{{warm_welcome}}{% endraw %}. The {% raw %}{{warm_welcome}}{% endraw %} tag is replaced with the {% raw %}{{greeting}}{% endraw %} substitution which calls the section "Hello {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %},". The {% raw %}{{first_name}}{% endraw %} and {% raw %}{{last_name}}{% endraw %} tags in "Hello {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %}," is then replaced with the recipients first and last names. + +{% anchor h3 %} +Email Content +{% endanchor %} + +{% anchor h4 %} +Text +{% endanchor %} + +{% codeblock %} +{% raw %}{{warm_welcome}}{% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    {% raw %}{{warm_welcome}}{% endraw %}
    +

    + + +{% endcodeblock %} + {% anchor h3 %} X-SMTPAPI Header {% endanchor %} @@ -289,24 +623,16 @@ X-SMTPAPI Header "example03@domain.com" ], "sub": { - "-first_name-": ["John", "Jane", "Matt"], - "-last_name-": ["Smith", "Williams", "Johnson"], - "-warm_welcome-": ["-greeting-", "-greeting-", "-greeting-"] + "{% raw %}{{first_name}}{% endraw %}": ["John", "Jane", "Matt"], + "{% raw %}{{last_name}}{% endraw %}": ["Smith", "Williams", "Johnson"], + "{% raw %}{{warm_welcome}}{% endraw %}": ["{% raw %}{{greeting}}{% endraw %}", "{% raw %}{{greeting}}{% endraw %}", "{% raw %}{{greeting}}{% endraw %}"] }, "section": { - "-greeting-": "Hello -first_name- -last_name-," + "{% raw %}{{greeting}}{% endraw %}": "Hello {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %}," } } {% endcodeblock %} -{% anchor h3 %} -Email Content -{% endanchor %} - -{% codeblock %} --warm_welcome- -{% endcodeblock %} - {% anchor h3 %} v3 Mail Send {% endanchor %} @@ -320,9 +646,9 @@ v3 Mail Send }], "subject": "Example 01", "substitutions": { - "-first_name-": "John", - "-last_name-": "Smith", - "-warm_welcome-": "-greeting-" + "{% raw %}{{first_name}}{% endraw %}": "John", + "{% raw %}{{last_name}}{% endraw %}": "Smith", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting}}{% endraw %}" } }, { "to": [{ @@ -331,9 +657,9 @@ v3 Mail Send }], "subject": "Example 02", "substitutions": { - "-first_name-": "Jane", - "-last_name-": "Williams", - "-warm_welcome-": "-greeting-" + "{% raw %}{{first_name}}{% endraw %}": "Jane", + "{% raw %}{{last_name}}{% endraw %}": "Williams", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting}}{% endraw %}" } }, { "to": [{ @@ -342,9 +668,9 @@ v3 Mail Send }], "subject": "Example 03", "substitutions": { - "-first_name-": "Matt", - "-last_name-": "Johnson", - "-warm_welcome-": "-greeting-" + "{% raw %}{{first_name}}{% endraw %}": "Matt", + "{% raw %}{{last_name}}{% endraw %}": "Johnson", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting}}{% endraw %}" } }], "from": { @@ -358,21 +684,131 @@ v3 Mail Send "subject": "Example", "content": [{ "type": "text/plain", - "value": "-warm_welcome-" + "value": "{% raw %}{{warm_welcome}}{% endraw %}" }, { "type": "text/html", - "value": "-warm_welcome-" + "value": "{% raw %}{{warm_welcome}}{% endraw %}" }], "sections": { - "-greeting-": "Welcome -first_name- -last_name-," + "{% raw %}{{greeting}}{% endraw %}": "Welcome {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %}," } } {% endcodeblock %} +{% anchor h3 %} +Example Outcome: +{% endanchor %} + +{% anchor h4 %} +example01@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello John Smith, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello John Smith,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example02@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Jane Williams, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Jane Williams,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example03@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Matt Johnson, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Matt Johnson,
    +

    + + +{% endcodeblock %} + {% anchor h2 %} -Complex Section and Substitution (01) +Three Different Greeting Sections with First & Last Name Substitutions {% endanchor %} +This example will show you how to create three different sections, each with first name and last name substitution for your emails. We will be using the tags "{% raw %}{{warm_welcome}}{% endraw %}", "{% raw %}{{greeting01}}{% endraw %}", "{% raw %}{{greeting02}}{% endraw %}", "{% raw %}{{greeting03}}{% endraw %}", "{% raw %}{{first_name}}{% endraw %}" and "{% raw %}{{last_name}}{% endraw %}" in this example. In this example we have created three different greetings using the section tag {% raw %}{{warm_welcome}}{% endraw %}. The {% raw %}{{warm_welcome}}{% endraw %} tag is replaced with either {% raw %}{{greeting01}}{% endraw %}, {% raw %}{{greeting02}}{% endraw %} or {% raw %}{{greeting03}}{% endraw %} substitution. This will call one of the three sections. In each of these sections there is the {% raw %}{{first_name}}{% endraw %} and {% raw %}{{last_name}}{% endraw %} tags which will get replaced with the recipients first and last names. + +{% anchor h3 %} +Email Content +{% endanchor %} + +{% anchor h4 %} +Text +{% endanchor %} + +{% codeblock %} +{% raw %}{{warm_welcome}}{% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    {% raw %}{{warm_welcome}}{% endraw %}
    +

    + + +{% endcodeblock %} + {% anchor h3 %} X-SMTPAPI Header {% endanchor %} @@ -385,26 +821,18 @@ X-SMTPAPI Header "example03@domain.com" ], "sub": { - "-first_name-": ["John", "Jane", "Matt"], - "-last_name-": ["Smith", "Williams", "Johnson"], - "-warm_welcome-": ["-greeting01-", "-greeting02-", "-greeting03-"] + "{% raw %}{{first_name}}{% endraw %}": ["John", "Jane", "Matt"], + "{% raw %}{{last_name}}{% endraw %}": ["Smith", "Williams", "Johnson"], + "{% raw %}{{warm_welcome}}{% endraw %}": ["{% raw %}{{greeting01}}{% endraw %}", "{% raw %}{{greeting02}}{% endraw %}", "{% raw %}{{greeting03}}{% endraw %}"] }, "section": { - "-greeting01-": "Welcome -first_name- -last_name-,", - "-greeting02-": "Hello -first_name- -last_name-,", - "-greeting03-": "Dear -first_name- -last_name-," + "{% raw %}{{greeting01}}{% endraw %}": "Welcome {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %},", + "{% raw %}{{greeting02}}{% endraw %}": "Hello {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %},", + "{% raw %}{{greeting03}}{% endraw %}": "Dear {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %}," } } {% endcodeblock %} -{% anchor h3 %} -Email Content -{% endanchor %} - -{% codeblock %} --warm_welcome- -{% endcodeblock %} - {% anchor h3 %} v3 Mail Send {% endanchor %} @@ -418,9 +846,9 @@ v3 Mail Send }], "subject": "Example 01", "substitutions": { - "-first_name-": "John", - "-last_name-": "Smith", - "-warm_welcome-": "-greeting01-" + "{% raw %}{{first_name}}{% endraw %}": "John", + "{% raw %}{{last_name}}{% endraw %}": "Smith", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting01}}{% endraw %}" } }, { "to": [{ @@ -429,9 +857,9 @@ v3 Mail Send }], "subject": "Example 02", "substitutions": { - "-first_name-": "Jane", - "-last_name-": "Williams", - "-warm_welcome-": "-greeting02-" + "{% raw %}{{first_name}}{% endraw %}": "Jane", + "{% raw %}{{last_name}}{% endraw %}": "Williams", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting02}}{% endraw %}" } }, { "to": [{ @@ -440,9 +868,9 @@ v3 Mail Send }], "subject": "Example 03", "substitutions": { - "-first_name-": "Matt", - "-last_name-": "Johnson", - "-warm_welcome-": "-greeting03-" + "{% raw %}{{first_name}}{% endraw %}": "Matt", + "{% raw %}{{last_name}}{% endraw %}": "Johnson", + "{% raw %}{{warm_welcome}}{% endraw %}": "{% raw %}{{greeting03}}{% endraw %}" } }], "from": { @@ -456,23 +884,135 @@ v3 Mail Send "subject": "Example", "content": [{ "type": "text/plain", - "value": "-warm_welcome-" + "value": "{% raw %}{{warm_welcome}}{% endraw %}" }, { "type": "text/html", - "value": "-warm_welcome-" + "value": "{% raw %}{{warm_welcome}}{% endraw %}" }], "sections": { - "-greeting01-": "Welcome -first_name- -last_name-,", - "-greeting02-": "Hello -first_name- -last_name-,", - "-greeting03-": "Dear -first_name- -last_name-," + "{% raw %}{{greeting01}}{% endraw %}": "Welcome {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %},", + "{% raw %}{{greeting02}}{% endraw %}": "Hello {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %},", + "{% raw %}{{greeting03}}{% endraw %}": "Dear {% raw %}{{first_name}}{% endraw %} {% raw %}{{last_name}}{% endraw %}," } } {% endcodeblock %} +{% anchor h3 %} +Example Outcome: +{% endanchor %} + +{% anchor h4 %} +example01@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Welcome John Smith, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Welcome John Smith,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example02@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Hello Jane Williams, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello Jane Williams,
    +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example03@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Dear Matt Johnson, +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Dear Matt Johnson,
    +

    + + +{% endcodeblock %} + {% anchor h2 %} -Complex Section and Substitution (02) +Three Confirmation Sections and Substitutions +{% endanchor %} + +This example will show you how to create three different sections for confirmation emails. We will be using the tags "{% raw %}{{name}}{% endraw %}", "{% raw %}{{confirmations}}{% endraw %}", "{% raw %}{{confirmation_001}}{% endraw %}", "{% raw %}{{confirmation_002}}{% endraw %}", "{% raw %}{{confirmation_003}}{% endraw %}" and "{% raw %}{{order_id}}{% endraw %}" in this example. In this example we have created three different confirmations using the section tag {% raw %}{{confirmations}}{% endraw %}. The {% raw %}{{confirmations}}{% endraw %} tag is replaced with either {% raw %}{{confirmation_001}}{% endraw %}, {% raw %}{{confirmation_002}}{% endraw %} or {% raw %}{{confirmation_003}}{% endraw %} substitution. This will call one of the three sections. In each of these sections there is the {% raw %}{{order_id}}{% endraw %} tag which will get replaced with the recipients order id. + +{% anchor h3 %} +Email Content +{% endanchor %} + +{% anchor h4 %} +Text {% endanchor %} +{% codeblock %} +Hello {% raw %}{{name}}{% endraw %}, +{% raw %}{{confirmations}}{% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Hello {% raw %}{{name}}{% endraw %},
    + {% raw %}{{confirmations}}{% endraw %} +

    + + +{% endcodeblock %} + {% anchor h3 %} X-SMTPAPI Header {% endanchor %} @@ -481,28 +1021,18 @@ X-SMTPAPI Header { "to": ["example01@domain.com", "example02@domain.com", "example03@domain.com"], "sub": { - "-name-": ["John", "Jane", "Matt"], - "-confirmations-": ["-confirmation_001-", "-confirmation_002-", "-confirmation_003-"], - "-order_id-": ["12345", "23456", "34567"] + "{% raw %}{{name}}{% endraw %}": ["John", "Jane", "Matt"], + "{% raw %}{{confirmations}}{% endraw %}": ["{% raw %}{{confirmation_001}}{% endraw %}", "{% raw %}{{confirmation_002}}{% endraw %}", "{% raw %}{{confirmation_003}}{% endraw %}"], + "{% raw %}{{order_id}}{% endraw %}": ["12345", "23456", "34567"] }, "section": { - "-confirmation_001-": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-.", - "-confirmation_002-": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement.", - "-confirmation_003-": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-. You can download your invoice as a PDF for your records." + "{% raw %}{{confirmation_001}}{% endraw %}": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order {% raw %}{{order_id}}{% endraw %}.", + "{% raw %}{{confirmation_002}}{% endraw %}": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order {% raw %}{{order_id}}{% endraw %}. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement.", + "{% raw %}{{confirmation_003}}{% endraw %}": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order {% raw %}{{order_id}}{% endraw %}. You can download your invoice as a PDF for your records." } } {% endcodeblock %} -{% anchor h3 %} -Email Content -{% endanchor %} - -{% codeblock %} -Hello -name-, - --confirmations- -{% endcodeblock %} - {% anchor h3 %} v3 Mail Send {% endanchor %} @@ -516,8 +1046,9 @@ v3 Mail Send }], "subject": "Example 01", "substitutions": { - "-name-": "John", - "-confirmations-": "-confirmation_001-" + "{% raw %}{{name}}{% endraw %}": "John", + "{% raw %}{{order_id}}{% endraw %}": "12345", + "{% raw %}{{confirmations}}{% endraw %}": "{% raw %}{{confirmation_001}}{% endraw %}" } }, { "to": [{ @@ -526,8 +1057,9 @@ v3 Mail Send }], "subject": "Example 02", "substitutions": { - "-name-": "Jane", - "-confirmations-": "-confirmation_002-" + "{% raw %}{{name}}{% endraw %}": "Jane", + "{% raw %}{{order_id}}{% endraw %}": "23456", + "{% raw %}{{confirmations}}{% endraw %}": "{% raw %}{{confirmation_002}}{% endraw %}" } }, { "to": [{ @@ -536,8 +1068,9 @@ v3 Mail Send }], "subject": "Example 03", "substitutions": { - "-name-": "Matt", - "-confirmations-": "-confirmation_003-" + "{% raw %}{{name}}{% endraw %}": "Matt", + "{% raw %}{{order_id}}{% endraw %}": "34567", + "{% raw %}{{confirmations}}{% endraw %}": "{% raw %}{{confirmation_003}}{% endraw %}" } }], "from": { @@ -551,119 +1084,103 @@ v3 Mail Send "subject": "Example", "content": [{ "type": "text/plain", - "value": "Hello -name-,\r\n-confirmations-" + "value": "Hello {% raw %}{{name}}{% endraw %},\r\n{% raw %}{{confirmations}}{% endraw %}" }, { "type": "text/html", - "value": "

    Hello -name-,


    -confirmations-

    " + "value": "

    Hello {% raw %}{{name}}{% endraw %},
    {% raw %}{{confirmations}}{% endraw %}" }], "sections": { - "-confirmation_001-": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-.", - "-confirmation_002-": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement.", - "-confirmation_003-": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order -order_id-. You can download your invoice as a PDF for your records." + "{% raw %}{{confirmation_001}}{% endraw %}": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order {% raw %}{{order_id}}{% endraw %}.", + "{% raw %}{{confirmation_002}}{% endraw %}": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order {% raw %}{{order_id}}{% endraw %}. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement.", + "{% raw %}{{confirmation_003}}{% endraw %}": "Thanks for choosing SendGrid. This email is to confirm that we have processed your order {% raw %}{{order_id}}{% endraw %}. You can download your invoice as a PDF for your records." } } {% endcodeblock %} -{% anchor h2 %} -Complex Section and Substitution (03) +{% anchor h3 %} +Example Outcome: {% endanchor %} -{% anchor h3 %} -X-SMTPAPI Header +{% anchor h4 %} +example01@domain.com {% endanchor %} -{% codeblock lang:json %} -{ -"to": [ - "example01@domain.com", - "example02@domain.com", - "example03@domain.com" -], -"sub": { -"-first_name-": [ "Example", "Example", ""], -"-last_name-": [ "01", "", "" ], -"Welcome ,": ["-1-","-1-","-1-"], -" ,": [",",",",","], -"-warm_welcome-": [ "-greeting-", "-greeting-", "-greeting-"]}, -"section": { -"-greeting-": "Welcome -first_name- -last_name-,", -"-1-": "Welcome," } -} +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Welcome John, +Thanks for choosing SendGrid. This email is to confirm that we have processed your order 12345. {% endcodeblock %} -{% anchor h3 %} -Email Content +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Welcome John,
    + Thanks for choosing SendGrid. This email is to confirm that we have processed your order 12345. +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example02@domain.com +{% endanchor %} + +{% anchor h5 %} +Text {% endanchor %} {% codeblock %} --warm_welcome- +Hello Jane, +Thanks for choosing SendGrid. This email is to confirm that we have processed your order 23456. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement. {% endcodeblock %} -{% anchor h3 %} -v3 Mail Send +{% anchor h5 %} +HTML {% endanchor %} -{% codeblock lang:json %} -{ - "personalizations": [{ - "to": [{ - "email": "example01@domain.com", - "name": "Example 01" - }], - "subject": "Example 01", - "substitutions": { - "-first_name-": "Example", - "-last_name-": "01", - "Welcome ,": "-1-", - " ,": ",", - "-warm_welcome-": "-greeting-" - } - }, { - "to": [{ - "email": "example02@domain.com", - "name": "Example 02" - }], - "subject": "Example 02", - "substitutions": { - "-first_name-": "Example", - "-last_name-": "", - "Welcome ,": "-1-", - " ,": ",", - "-warm_welcome-": "-greeting-" - } - }, { - "to": [{ - "email": "example03@domain.com", - "name": "Example 03" - }], - "subject": "Example 03", - "substitutions": { - "-first_name-": "", - "-last_name-": "", - "Welcome ,": "-1-", - " ,": ",", - "-warm_welcome-": "-greeting-" - } - }], - "from": { - "email": "sender@senddomain.com", - "name": "Sender" - }, - "reply_to": { - "email": "sender@senddomain.com", - "name": "Sender" - }, - "subject": "will get replaced", - "content": [{ - "type": "text/plain", - "value": "-warm_welcome-" - }, { - "type": "text/html", - "value": "-warm_welcome-" - }], - "sections": { - "-greeting-": "Welcome -first_name- -last_name-,", - "-1-": "Welcome," - } -} +{% codeblock lang:html %} + + + +

    Hello Jane,
    + Thanks for choosing SendGrid. This email is to confirm that we have processed your order 23456. This invoice is to be paid by bank transfer within 7 days from the date of your monthly statement. +

    + + +{% endcodeblock %} + +{% anchor h4 %} +example03@domain.com +{% endanchor %} + +{% anchor h5 %} +Text +{% endanchor %} + +{% codeblock %} +Dear Matt, +Thanks for choosing SendGrid. This email is to confirm that we have processed your order 34567. You can download your invoice as a PDF for your records. +{% endcodeblock %} + +{% anchor h5 %} +HTML +{% endanchor %} + +{% codeblock lang:html %} + + + +

    Dear Matt,
    + Thanks for choosing SendGrid. This email is to confirm that we have processed your order 34567. You can download your invoice as a PDF for your records. +

    + + {% endcodeblock %} diff --git a/source/Classroom/Build/Add_Content/universal_links.md b/source/Classroom/Build/Add_Content/universal_links.md index 32471034fb..c088d8215c 100644 --- a/source/Classroom/Build/Add_Content/universal_links.md +++ b/source/Classroom/Build/Add_Content/universal_links.md @@ -52,8 +52,8 @@ There are several requirements that you must complete before you can begin using - Universal links for Android require that you set up an "digital asset links" JSON file, along with configuring intent filters in your Android app's manifest file. - Your **apple-app-site-association** and **digital asset links** files must be hosted on an HTTPS web server or content delivery network (CDN). - To ensure that your universal links register click tracking events, and to ensure that your recipient is taken to the correct page within your app, you must properly [resolve your links](#-Resolving-SendGrid-Click-Tracking-Links). -- You must complete the [link whitelabeling process]({{root_url}}/User_Guide/Settings/Whitelabel/links.html) for your account. When whitelabeling your links, you must use the same domain that will be used for your universal links. (e.g. links.example.com) -- On iOS, you must include your email link whitelabel subdomain in the "Associated Domains" for your app. Using the example above, you'd need to add an entry for "applinks:links.example.com" like this: +- You must complete the [link branding process]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) for your account. When branding your links, you must use the same domain that will be used for your universal links. (e.g. links.example.com) +- On iOS, you must include your branded link subdomain in the "Associated Domains" for your app. You can customize your subdoman using the custom return path in advanced settings while setting it up. Using the example above, you'd need to add an entry for "applinks:links.example.com" like this: ![]({{root_url}}/images/universal_links_ios.png) {% anchor h2 %} @@ -95,9 +95,9 @@ Example apple-app-site-association file: } {% endcodeblock %} -{% info %} +{% warning %} **Do not** append the .json file extension to your apple-app-site-association file! -{% endinfo %} +{% endwarning %} {% anchor h3 %} Example assetlinks.json file: @@ -121,9 +121,7 @@ Example assetlinks.json file: {% endcodeblock %} {% info %} -When configuring your universal links for Android devices, you must specify which URLs should be handled by the app and which should not. - -For iOS this is set in the "apple-app-site-association" file by including "paths": ["/uni/\*"], indicating that any URL containing the path "/uni/" should be opened in your app. +When configuring your universal links in iOS, you specify which paths you want to be handled by the app by using the `paths` argument in the `apple-app-site-association` file. By specifing only the path `["/uni/*"]`, and using the `universal=true` attribute on your links as documented below, only appropriate links will be handled by the app, and others will be opened in the phone's browser. Android requires that you specify these paths inside your app, rather than the assetlinks.json file. This is accomplished by adding intent filters for specific hosts and paths. Please visit [Google's Developer Documentation](https://developer.android.com/training/app-indexing/deep-linking.html) to learn how to add an intent filter to your app manifest that can handle your universal links. {% endinfo %} @@ -148,7 +146,7 @@ After creating your iOS "apple-app-site-association" file and/or your Android "d ![]({{root_url}}/images/universal_links_1.png) 5. Create a new folder in the bucket called “.well-known” -6. Inside of the ".well-known" folder, uplaod the same "apple-app-site-association" file as in step 2 +6. Inside of the ".well-known" folder, upload the same "apple-app-site-association" file as in step 2 7. As above, add a permission for **Everyone** to **Open/Download** (or **Read** in the new S3 UI) and change the Content-Type to “application/json” @@ -158,7 +156,7 @@ After creating your iOS "apple-app-site-association" file and/or your Android "d 10. Navigate to the **AWS Certificate Manager** -11. Request a new certificate for the domain your link whitelabel is configured for (e.g. links.example.com) +11. Request a new certificate for the domain your link branding is configured for (e.g. links.example.com) 12. AWS will send an email to the appropriate domain owners, requesting them to approve the certificate @@ -244,7 +242,7 @@ Setting Up Universal Links Using NGINX After creating your iOS "apple-app-site-association" file and/or your Android "digital asset links" file, you need to host them on a secure content delivery network. The following instructions will guide you through setting up NGINX to host these files. -1. Request a new certificate for the domain your link whitelabel is configured for (e.g. links.example.com) +1. Request a new certificate for the domain your link branding is configured for (e.g. links.example.com) 2. Place the certificate chain into the file named **/etc/pki/tls/certs/links.example.com.crt** @@ -306,7 +304,10 @@ For example: `Link to your app!` +This way, as long as your association file has the `paths` restricted to `/uni/*` as we recommend above, only the links that you want to be handled by your app will be. + If you exclude the `universal="true"` attribute, your links will still function, but they will take your recipient to their mobile browser. +If you exclude the `/uni/*` path in your `apple-app-site-association`, the _all_ links for your authenticated domain will be forwarded for your app to handle, which may cause issues. {% anchor h2 %} Resolving SendGrid Click Tracking Links diff --git a/source/Classroom/Build/Choose_Content/a_b_testing.md b/source/Classroom/Build/Choose_Content/a_b_testing.md deleted file mode 100644 index 5bdc360115..0000000000 --- a/source/Classroom/Build/Choose_Content/a_b_testing.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -seo: - title: A/B Testing - description: A/B Testing - keywords: -title: A/B Testing -weight: 0 -layout: page -zendesk_id: 204820677 -navigation: - show: true ---- - -**I chose to manually pick the winner of my A/B test campaign. Where do I do that?** - -You can go into the campaign stats for a campaign anytime after your campaign starts sending to pick the winner. - -**I chose to manually pick the winner of my A/B test campaign. How will I know when to do that?** - -You’ll get an email on the time-out of your A/B test duration, reminding you to go into the UI and pick your winner. You can also choose the winner at any time within that duration if one variation vastly outperforms the other. - -**Can I change the winner method after I’ve started sending my A/B test campaign?** - -You cannot change the winner method after your campaign has started sending. - -**Can I find out which of my recipients received each variation of my A/B test campaign?** - -At this time we do not have that functionality but it is on our roadmap. - -**Can I export raw stats for each of my A/B test variations?** - -Yes! You can click the “Export CSV” button on the campaign stats page and it will give you a line of stats for each variation (as well as a line for totals) per day. - diff --git a/source/Classroom/Build/Format_Content/html_formatting_issues.md b/source/Classroom/Build/Format_Content/html_formatting_issues.md index f8937cb4fa..03521194b4 100644 --- a/source/Classroom/Build/Format_Content/html_formatting_issues.md +++ b/source/Classroom/Build/Format_Content/html_formatting_issues.md @@ -13,19 +13,19 @@ navigation: To be successful sending email through SendGrid and to ensure that your content gets preserved as needed, please follow these guidelines. These guidelines are also useful if you are encountering issues with the HTML formatting or styling of your messages. -1. Ensure your email contains both Plaintext and HTML versions so recipients can view the information within the mail client of their choice. If you only send HTML emails and a recipient's server or mail client blocks HTML content, they will not see anything in your emails. +1. Ensure your email contains both Plaintext and HTML versions so recipients can view the information within the mail client of their choice. If you only send HTML emails and a recipient's server or mail client blocks HTML content, they will not see anything in your emails. -2. Make sure that each line of content does not exceed 78 characters in length, nor that you exceed 998 continuous characters. +2. Make sure that each line of content does not exceed 78 characters in length, nor that you exceed 998 continuous characters. -a) We follow this RFC for how email should be formatted (refer to 2.1.1. Line Length Limits) - [http://tools.ietf.org/html/rfc5322](http://tools.ietf.org/html/rfc5322) +a) We follow this RFC for how email should be formatted (refer to 2.1.1. Line Length Limits) - [http://tools.ietf.org/html/rfc5322](http://tools.ietf.org/html/rfc5322) -3. Some mailers, such as Apple Mail, place Multipurpose Internet Mail Extensions (MIME) into emails automatically which can cause our system to not parse the boundaries correctly. If you do notice a problem with the content from your email not rendering correctly, please do the following: +3. Some mailers, such as Apple Mail, place Multipurpose Internet Mail Extensions (MIME) into emails automatically which can cause our system to not parse the boundaries correctly. If you do notice a problem with the content from your email not rendering correctly, please do the following: a) First, login to your SendGrid account, click on "Settings", then "Mail Settings", and drop down the Plain Content setting, and then place a check mark in the _Don't Convert Plaintext to HTML_ option. Be sure to save this setting. b) Send another email using your application and see if the content still cannot be rendered. -4. Some mail clients, such as Outlook and Thunderbird, appear to insert double spacing line breaks at every line. The reason is that the 'content-transfer-encoding' in MIME is set to 'quoted-printable' which adds Carriage Return Line Feed (CRLF) line breaks to the source content of the email which are characters interpreted by these mail clients. To alleviate this problem, please do the following: +4. Some mail clients, such as Outlook and Thunderbird, appear to insert double spacing line breaks at every line. The reason is that the 'content-transfer-encoding' in MIME is set to 'quoted-printable' which adds Carriage Return Line Feed (CRLF) line breaks to the source content of the email which are characters interpreted by these mail clients. To alleviate this problem, please do the following: a) If you can customize the MIME settings for your email, set the 'Content-Transfer-Encoding' to '7bit' instead of 'Quoted-Printable.' @@ -33,7 +33,7 @@ b) Ensure that your content follows the line length limits from item 2 above. 5. Hard line breaks appear as CRLF characters in the source of an email with the character combination of " **=0D**" in the source of an email. This only happens with 'quoted-printable' (Content-Transfer-Encoding set in MIME) emails. Email clients such as Outlook and Thunderbird render these characters which results in additional breaks in the content of your emails. -6. The best possible MIME layout in your email when sending through SendGrid is as follows. It is best to reference files using separate links to download since it lowers the percentage of spam threshold for most domains you are sending to. +6. The best possible MIME layout in your email when sending through SendGrid is as follows. It is best to reference files using separate links to download since it lowers the percentage of spam threshold for most domains you are sending to. diff --git a/source/Classroom/Build/Format_Content/html_rendering__the_dos_and_donts_of_cross_platform_email_design.md b/source/Classroom/Build/Format_Content/html_rendering__the_dos_and_donts_of_cross_platform_email_design.md index 965c0d2d5d..112628c66a 100644 --- a/source/Classroom/Build/Format_Content/html_rendering__the_dos_and_donts_of_cross_platform_email_design.md +++ b/source/Classroom/Build/Format_Content/html_rendering__the_dos_and_donts_of_cross_platform_email_design.md @@ -13,9 +13,9 @@ navigation: **Why Do My Emails Look Different in Different Mail Clients? What Have You Done!?!** -Have you ever spent all day and night formatting an email, sent it out, only to find out that it looks completely different on one email client than an other? If so, we feel your pain. However, before declaring 'shenanigans', it may be important for you to understand that these differences are being caused by the mail clients' unique ways of rendering these emails. +Have you ever spent all day and night formatting an email, sent it out, only to find out that it looks completely different on one email client than an other? If so, we feel your pain. However, before declaring 'shenanigans', it may be important for you to understand that these differences are being caused by the mail clients' unique ways of rendering these emails. -All Mail clients render HTML/CSS differently, in their own ways and for their own reasons. The differences in what HTML and CSS they support depends on many factors. When rendering HTML and CSS in emails many things affect what the end user is going to see. The mail exchange server, the preprocessor, the browsers, the rendering engines, and more; all affect the way your message is going to be displayed. These vary from client to client; browser to browser; server to server. However, don't start pulling your hair out just yet, because there are some best practices you can utilize so that your emails' coding will stay in tact across different clients and platforms. +All Mail clients render HTML/CSS differently, in their own ways and for their own reasons. The differences in what HTML and CSS they support depends on many factors. When rendering HTML and CSS in emails many things affect what the end user is going to see. The mail exchange server, the preprocessor, the browsers, the rendering engines, and more; all affect the way your message is going to be displayed. These vary from client to client; browser to browser; server to server. However, don't start pulling your hair out just yet, because there are some best practices you can utilize so that your emails' coding will stay in tact across different clients and platforms. **LAYOUT** @@ -90,6 +90,6 @@ All Mail clients render HTML/CSS differently, in their own ways and for their ow - Many clients simply cannot support rendering video (other than GIFs) in their emails - JavaScript nor the object tag are supported in many clients or browsers and thus can't support video rendering -STILL HAVING ISSUES? QUESTIONS? CONCERNS? Just contact our support team and we will be happy to help. We can provide the tools and the knowledge base to help you understand what your mail will look like across platforms and how to gain insight in making them appear consistent across these platforms. +STILL HAVING ISSUES? QUESTIONS? CONCERNS? Just contact our support team and we will be happy to help. We can provide the tools and the knowledge base to help you understand what your mail will look like across platforms and how to gain insight in making them appear consistent across these platforms. diff --git a/source/Classroom/Build/Format_Content/plain_text_emails_converted_to_html.md b/source/Classroom/Build/Format_Content/plain_text_emails_converted_to_html.md index ac0e548339..b9f3468f87 100644 --- a/source/Classroom/Build/Format_Content/plain_text_emails_converted_to_html.md +++ b/source/Classroom/Build/Format_Content/plain_text_emails_converted_to_html.md @@ -29,7 +29,7 @@ The following filters convert plain text emails to HTML so the proper HTML tags **How can I control the resulting conversion (see update below)** 1. You can turn off the filters causing the conversion from plain text to HTML. -2. If you start each line with a space, this will add a "preformatted"
     tag around the line.
    +2. If you start each line with a space, this will add a "preformatted" `
    ` tag around the line.
     3. You can separate new sentences with double newlines, which will add a "paragraph" 

    tag around the sentence. 4. You can convert your message to HTML, bypassing our need to convert it altogether diff --git a/source/Classroom/Deliver/Address_Lists/affiliate_lists_and_list_sharing.md b/source/Classroom/Deliver/Address_Lists/affiliate_lists_and_list_sharing.md deleted file mode 100644 index 65a58e3855..0000000000 --- a/source/Classroom/Deliver/Address_Lists/affiliate_lists_and_list_sharing.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -seo: - title: Affiliate Lists & List Sharing - description: Affiliate Lists & List Sharing - keywords: bought, purchase, affiliate, marketing, sharing, partners, permission, opt-in, purchased, lists, offers -title: Affiliate Lists & List Sharing -weight: 0 -layout: page -zendesk_id: 200182898 -navigation: - show: true ---- - - **Exercise Caution: List Sharing** - -List sharing is one of the most common ways to run into trouble within the email marketing world. List sharing can be an effective way to expand your marketing base, however it is essential to use extra caution in how this is done in order to preserve your reputation as a sender over the long run. - -While you think your recipients may be interested in other related offers, it is bad practice to give your recipient list to other senders. When a sender shares their list, the recipient begins receiving mail they did not solicit. If the recipient is able to trace it back to the original opted in sender, they may feel that their personal information has been compromised. This will harm the original sender’s business severely because they have opened up the recipient’s address to spam. In turn, the recipient will no longer trust this sender. - -So how do you get recipients that you believe would be interested in your product or service to know you exist? One option is to place a “shout out” about your partner in your email. Just be aware that many ESPs scan their incoming emails for blacklisted urls so do not send any email on behalf of other companies that you have not investigated and found to be completely safe and unassociated with spam. - -During the opt in process there may be a clause or checkbox that would indicate the possibility of receiving email from affiliated senders. Checkboxes should be unchecked by default so the recipient is taking action to opt into receiving other email. If affiliated senders are going to be utilizing your list, it must be in your Terms and Conditions. Your Terms and Conditions should be very visible and clearly stated on the opt in page, not as a link or different location within the site. Keep in mind that your affiliate senders should be sending content very similar and related to the content the recipient has opted in to receive. - -**Remember: the most clear opt-in process will always return better recipient satisfaction.** - diff --git a/source/Classroom/Deliver/Address_Lists/let_old_addresses_sleep_in_peace.md b/source/Classroom/Deliver/Address_Lists/let_old_addresses_sleep_in_peace.md deleted file mode 100644 index e665c9ecef..0000000000 --- a/source/Classroom/Deliver/Address_Lists/let_old_addresses_sleep_in_peace.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -seo: - title: Let Old Addresses Sleep in Peace! - description: Let Old Addresses Sleep in Peace! - keywords: address, double, opt-in, notification, old, best, spam traps, lists, practices -title: Let Old Addresses Sleep in Peace! -weight: 0 -layout: page -zendesk_id: 200182948 -navigation: - show: true ---- - -The majority of problems that arise with senders joining SendGrid are the result of sending to old, unengaged address lists. We understand that is it hard for a business to forfeit potential customers but sending to an old address list has the potential to trash your deliverability and completely ruin your brand name. - -What problems can arise: - -- Spam trap hits - Old addresses (or even entire domains) that have been abandoned may be recycled into [spam traps]({{root_url}}/Classroom/Deliver/Undeliverable_Email/spam_trapped.html). Once recycled, spam traps never opt in to receive email. So while an address may have opted in years ago, the spam trap will see your emails as unsolicited, determining that you are sending spam. Play it safe and remove addresses that haven’t engaged with your emails in six months. You don’t want old addresses that are no longer interested in receiving your emails ruin your reputation so that new, engaged addresses don’t get them. - -- Bounces - Old addresses that have been taken out of commision will likely result in a bounce. Receiving mailboxes monitor how many bounces you have on their system and will reject your email if this volume is too high. - -- Spam Complaints - A recipient who is no longer interested in your email (and may not even remember opting in) is much more likely to report your email as spam. What difference is it to the recipient when they are cleaning out their inbox: reporting as spam or unsubscribing? They have virtually the same outcome for the recipient and reporting email as spam is often times easier. - -All of the above are key factors that influence how ESPs, ISPs, Reputation Monitors and Blacklists base their decisions to accept or deny mail. - -How can you prevent this from happening: - -- If an address has **not engaged with your emails in over six months** , they are probably not interested in or expecting to receive your emails. **Remove these addresses**. They are doing you more harm than good at this point. - -- The best way to make sure your recipients are engaged is to **make sure they have explicitly opted in**. Seems obvious? Well, we hope so :) [Double opt in]({{root_url}}/Glossary/opt_in_email.html) is preferable as it verifies you are sending to a legitimate address, and confirms that your subscriber wants to receive your email. - -- **Re-opt in**. Don’t rely on them to unsubscribe. Using our [Event API](http://sendgrid.com/docs/API_Reference/Webhooks/event.html), check to see if they are clicking or opening your mail. If not, send them a winback email and follow these [best practices]({{root_url}}/Glossary/reconfirmation.html) regarding your reconfirmation campaign. - -- Address turnover rates are around 30% per year. **Put a form in place** that makes it easy for subscribers to notify you that they have changed their address. - -- **Keep contact**. Continue engaging with your subscribers, keep them updated, find clever ways to keep them interested. This way they won’t forget about you and mark your email as unsolicited spam. - -- Make sure your **unsubscribe link** is always very visible and easy to use. Remember that you are competing with the “Report Spam” button for ease of use... - -- Ensure that **bad addresses are suppressed**. SendGrid automatically suppresses all previously bounced, blocked, spam reported, unsubscribed, and invalid emails under your “Email Reports”. Be safe and remove these addresses from your master list. - - -When it comes to list housekeeping, a little effort in the short term can go a ways in the long run and will save you a lot of headache. After employing these methods, you will have a great reputation with receiving mailboxes giving you better deliverability and higher engagement rates. Besides, nobody wants to be known for sending spam. diff --git a/source/Classroom/Deliver/Address_Lists/list_scrubbing_guide.md b/source/Classroom/Deliver/Address_Lists/list_scrubbing_guide.md deleted file mode 100644 index 3cfcc7a0e5..0000000000 --- a/source/Classroom/Deliver/Address_Lists/list_scrubbing_guide.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -seo: - title: List Scrubbing Guide - description: List Scrubbing Guide - keywords: spam, role, address, unsolicited, cleaning, scrubbing, suppress, unsubscribe, bad, bogus, old, invalid, unsubscribed, spam traps, lists -title: List Scrubbing Guide -weight: 0 -layout: page -zendesk_id: 200183028 -navigation: - show: true ---- - -It’s springtime here in the United States and nothing brings in the spirit like a good spring cleaning. At SendGrid, this means scrubbing your list. For senders, a scrubbed list sent by SendGrid can be the ticket to delivery heaven. Unfortunately, scrubbing your list can be intimidating. Senders don’t know where to start and resort to using list cleaning services. What senders might not know is that cleaning your list can be done for free and much, much more effectively. - -We have put together simple steps that will improve any senders list. A bad list is fraught with problems and if left unbrushed, can lead to removing all of a senders teeth which requires a lot of resources to replace. Please go through these; we promise it will save you a trip to the dentist in the long run. - -** ** - -1. SendGrid automatically suppresses hard bounces if you try to send to them again. Let me make this clear - don’t waste your credits; remove these addresses from your list. Keeping your list up to date will save you money and time should you try to send somewhere else with your list. -2. This may seem obvious but when people unsubscribe, remove them from your list! If you are keeping unsubscribed addresses around, they have broken up with you and it is best to move on. Delete their addresses. -3. Remove repeat addresses. Sending to the same address twice greatly increases their chance of submitting a spam complaint. In fact, they will probably send two spam complaints. Spam complaints will cause the death of a senders deliverability. -4. Typos. Mistakes can happen in the process of acquiring addresses. This can be misspelling the domain (@ [homail.com](http://homail.com/), @ [gmal.com](http://gmal.com/), etc.) or any piece of the address (@ [gmail.cm](http://gmail.cm/), @gmailcom, etc.). A great way to avoid this is in the registration form process. Have the recipient input their address twice to ensure it is correct. Then to make sure the address is real, do a [double opt-in]({{root_url}}/Glossary/opt_in_email.html). -5. Seek out the dead domains. Many times these are used as [spam traps]({{root_url}}/Classroom/Deliver/Undeliverable_Email/spam_trapped.html) and sending to them will ruin a sender’s deliverability. Write a script or make a list of the domains you are sending to and do an mx lookup via the command line or a service like http://mxtoolbox.com to find defunct domains, some of which may now be turned into spam traps. -6. Find email addresses that are commonly used as spam traps or used to determine if you are sending spam. This means all role addresses (abuse@, sales@, help@, etc.) as well as common spam trap names (junk@, test@, asdf@, spam@, etc.). -7. Keep track of date of opt-in. This provides great opportunity for scrubbing out stale addresses. [Deal with old addresses appropriately]({{root_url}}/Classroom/Deliver/Address_Lists/let_old_addresses_sleep_in_peace.html) as they often lead to sending to spam traps or recipients likely to spam complain. Remember the best way to keep your addresses current is to [maintain engagement]({{root_url}}/Classroom/Deliver/Delivery_Introduction/keep_in_touch_the_importance_of_engagement.html) giving the recipient an opportunity to unsubscribe as well as ensuring that they remember your relationship. - -Remember, brush often and make periodical appointments for a deep cleaning. diff --git a/source/Classroom/Deliver/Address_Lists/peer_initiated_email_invitation_requirements.md b/source/Classroom/Deliver/Address_Lists/peer_initiated_email_invitation_requirements.md deleted file mode 100644 index 829ea4746e..0000000000 --- a/source/Classroom/Deliver/Address_Lists/peer_initiated_email_invitation_requirements.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -seo: - title: Peer-Initiated Email Invitation Requirements - canonical: https://sendgrid.com/blog/best-practices-for-invite-a-friend-emails/ - description: Peer-Initiated Email Invitation Requirements - keywords: spam, permission, list, best, practice, peer -title: Peer-Initiated Email Invitation Requirements -weight: 0 -layout: page -zendesk_id: 200182848 -navigation: - show: true ---- - -A peer-initiated invitation system can help your subscribers spread the word about your service and grow your user base—if done well. An aggressive invitation system can backfire, and your invitations will be filtered or blocked. SendGrid customers who implement a peer-initiated invitation system _must_ abide by the following requirements: - -1. **Never allow your subscribers to send invitations to their _entire_ address book.** Address books contain old, stale addresses that ISPs use as spam traps. A spam trap is an address that doesn’t send mail, and marks the mail it does receive as spam. If your invitations hit spam traps, your subsequent messages will be filtered by ISPs. To prevent this, design your invitation system so that your inviter must deliberately select each individual invitee. -2. **Limit the number of invitations each customer can send to encourage selective, quality invitations. ** When your customers are careful to invite only those who they think will appreciate your service, you reduce the risk of invitees reporting the invitations as spam. If enough people report your invitations as spam, your invitations will be blocked or filtered—not what you intended. -3. **Clearly display the inviter’s name or email address** , so the invitee knows who sent the invitation. (Peer-initiated invitations are most effective when the invitee knows and trusts the inviter.) -4. **The invitation messages’ From address must reflect your brand.** Don’t use the inviter’s email address for the invitation’s From address. -5. **Clearly express the purpose of the invitation.** Recipients must understand what they are being invited to. -6. After the initial invitation, ** don’t send more than one follow-up** (reminder) email to invitees that didn’t respond to the first invitation. - -You increase the odds of your invitations reaching the recipient when you structure your systems and processes to send the right message, to the right person, at the right time, with the right frequency. If you don’t, your messages will be marked as spam and your marketing results will suffer. Avoid those pitfalls. - -SendGrid also strongly recommends: - -1. Ensure your invitation is relevant and valued by the recipient. -2. Let your inviters add a personal text-only message to their invitation. (No URLs, as they may be used to exploit or infect the invitee.) -3. Include a conspicuous, functioning opt-out link—it’s better for the recipient to remove themselves from future mailings than to report your message as spam. -4. Beware of offering invitation incentives to your subscribers. Incentives may encourage them to invite people who aren’t likely to want your service, and this could lead to backlash. -5. Monitor your spam complaints. Some inviters will trigger spam complaints by sending invitations to people who don’t want them. If your system correlates spam complaints with the troublesome inviter, you can limit their invitation quota to minimize the adverse effect on _your_email sending reputation. -6. Typos happen. Pre-screen the email addresses you collect before you send the invitation. Ensure addresses are syntactically correct, and that the domain part of the address has a DNS MX record (which indicates that the domain accepts mail). diff --git a/source/Classroom/Deliver/Address_Lists/preference_centers_giving_subscribers_control.md b/source/Classroom/Deliver/Address_Lists/preference_centers_giving_subscribers_control.md deleted file mode 100644 index 5d0b5e07dd..0000000000 --- a/source/Classroom/Deliver/Address_Lists/preference_centers_giving_subscribers_control.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -seo: - title: Preference Centers: Giving Subscribers Control - description: Preference Centers: Giving Subscribers Control - keywords: subscription, unsubscribe, suppress, preference, center -title: Preference Centers: Giving Subscribers Control -weight: 0 -layout: page -zendesk_id: 204585828 -navigation: - show: true ---- - -Every subscriber is different. Some recipients may find weekly coupons conducive while others may only wish to receive a monthly newsletter. By giving your subscribers complete control over what they want to receive, you can greatly reduce the risk of sending messages recipients may not wish to receive. - -An email preference center allows subscribers to choose what kind of messages they want to subscribe to and when they would like to receive those messages. Examples of preference center parameters include: - -* How often a subscriber is sent mail -* Which mail streams they wish to receive -* Whether or not they wish to receive website notifications. - -Implementing a preference center improves your ISP reputation as your messages would only be sent to subscribers who are interested in receiving it and will most likely engage with it. - -Preference centers show that you want your subscribers to have the best email experience possible. They also give you valuable information about your subscribers that you can use to better target them with future messages. Having a preference center is essential to creating a great email program. - -You can begin implementing these features by using SendGrid's [Unsubscribe Groups]({{root_url}}/User_Guide/Suppressions/advanced_suppression_manager.html) functionality. Unsubscribe Groups allow your recipients to specify which specific types of emails they would like to stop receiving. When you send an email with an Unsubscribe Group specified, the recipient will be provided with two links: one link to unsubscribe from that group of emails, and another link to their [Recipient Subscription Preferences]({{root_url}}/User_Guide/Suppressions/recipient_subscription_preferences.html). This page is an example of the type of "preference center" described above and is a good start to giving your recipients more control over what email they receive. diff --git a/source/Classroom/Deliver/Address_Lists/role_addresses.md b/source/Classroom/Deliver/Address_Lists/role_addresses.md deleted file mode 100644 index 4bf1e2f5b1..0000000000 --- a/source/Classroom/Deliver/Address_Lists/role_addresses.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -seo: - title: Role Addresses - description: Role Addresses - keywords: role, address -title: Role Addresses -weight: 0 -layout: page -zendesk_id: 200506117 -navigation: - show: true ---- - -**What is a role address?** - -Role email addresses are those that represent either a group of people within a company or the entire organization itself. These addresses are generally designed with a specific function in mind and are only intended to receive messages pertaining to that particular function. For example, a company would setup a role address for recruiting@domain.com in order to catch all of the emails regarding employment and funnel them to the appropriate team or department. The majority of role addresses notify multiple people at once, and the person(s) in charge of monitoring these email accounts can change unexpectedly. - -Examples of role addresses include: - -- abuse@ -- admin@ -- billing@ -- info@ -- jobs@ -- marketing@ -- postmaster@ -- sales@ -- support@ - -**Should I send to role addresses?** - -_No, it is almost always a bad idea to have role addresses on your mailing list._ When someone signs up to receive emails at a role address they are also signing up everyone else with access to that address, and this is where the problems can start. Just because one person has given permission to receive messages to a role address does not mean that the other people who monitor the account did, and so the chances of your messages being marked as spam rise significantly. - -Role addresses are generally listed on public-facing web pages, and this makes them very susceptible to harvesting bots (special software used by spammers that searches the Internet for email addresses). This also means that most bought lists include a high percentage of role addresses. SendGrid does not disallow role addresses, but if we see an account with high complaint rates that sends to a lot of roles on a consistent basis then that account is most likely using a purchased list, which does explicitly violate our [Email Policy](http://sendgrid.com/email_policy). Furthermore, many blacklisting services have setup [phony role addresses](https://sendgrid.com/docs/Glossary/spam_traps.html) in order to catch spammers who send unsolicited email. - -**Overall, role addresses are not good email contacts.** The people in charge of those accounts can change at anytime, they generate more spam complaints, and they can even cause an IP address or sending domain to be blacklisted. We encourage all of our users to only communicate with individual email addresses that have personally opted in, because it could mean the difference between a successful marketing campaign and a big drop in sender reputation. - diff --git a/source/Classroom/Deliver/Address_Lists/tips_to_keep_your_list_organized.md b/source/Classroom/Deliver/Address_Lists/tips_to_keep_your_list_organized.md deleted file mode 100644 index 6fe6babc36..0000000000 --- a/source/Classroom/Deliver/Address_Lists/tips_to_keep_your_list_organized.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -seo: - title: Tips To Keep Your List Organized - description: Tips To Keep Your List Organized - keywords: segmentation, opt-in, list, spam traps, lists -title: Tips To Keep Your List Organized -weight: 0 -layout: page -zendesk_id: 200182908 -navigation: - show: true ---- - -List segmentation refers to the practice of customizing a larger master address list into smaller sub-lists categorized based on certain criteria with the goal of enhancing the level of email customization for your recipients. This allows you to gain more analytical insight to a specific campaign’s performance or isolate the deliverability impact among different campaigns. - - - -You might like to segment your address list based on the campaigns you are running. This is a good practice if you are sending a mix of transactional/confirmation, notification, and newsletter emails to your users. Some of your users may want to opt-out of notifications or newsletters while still receiving more important transactional/confirmation emails. - - - -Another criteria for list segmentation is segregation by address acquisition time. Segmenting your list in this manner is helpful in personalizing your email campaigns. It can be helpful to have a list regarding recipients that you have not interacted with in a while (4 months or more). This list can be used for “win back” campaigns. A good example of a campaign like this is as follows: - -[http://www.responsys.com/blogs/nsm/assets\_c/2012/05/Screen%20shot%202012-05-07%20at%2010.37.27%20AM-1103.html](http://www.responsys.com/blogs/nsm/assets_c/2012/05/Screen%20shot%202012-05-07%20at%2010.37.27%20AM-1103.html) - - - -Also, it is wise to segregate these sublists so that each are sending on different IPs. For example, it is common to set up transactional/confirmation emails on a separate IP than your marketing emails as these are more prone to being responded to as spam or causing the recipient “email fatigue”. The reason for this is to protect the deliverability of your important emails from the potential harm due to the complaints from your more potentially risky marketing campaigns (or any other type of email that could cause “email fatigue” for the recipient). An old list that you may use for a win back campaign might have a lot of bounces and email addresses that are now invalid. Separating this campaign from your other email with a separate IP protects your other IPs reputation and deliverability. - - - -You may want to target different email campaigns according to engagement. If you have gone into your apps, and are a silver plan or higher, you can enable click and open tracking. You may wish to segment those who have interacted with your email and invite them to special webinars or events. - - - -List segmentation is a great tool that can be used to power your email campaigns as well as protect your reputation as a sender. Happy sending! diff --git a/source/Classroom/Deliver/Address_Lists/where_did_you_get_my_address_permission_reminders.md b/source/Classroom/Deliver/Address_Lists/where_did_you_get_my_address_permission_reminders.md deleted file mode 100644 index 952fcc04ac..0000000000 --- a/source/Classroom/Deliver/Address_Lists/where_did_you_get_my_address_permission_reminders.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -st: - published_at: 2016-09-02 - type: Classroom -seo: - title: Where did you get my address? - Permission Reminders - description: Be sure to manage your receivers' expectations with simple permission reminders! - keywords: spam, role, address, permission, opt-in, scrape, unsolicited, unsubscribe -title: Where did you get my address? - Permission Reminders -weight: 0 -layout: page -zendesk_id: 200410253 -navigation: - show: true ---- - -People often sign up to receive email and then simply forget about it. It begins with a customer giving you their email address so they can get that free appetizer, awesome coupon, or to create a free account for your service. Unfortunately, by the time your message reaches your customer’s inbox, the appetizer is long gone and the recipient is left wondering how on earth you got their address. - -This is where permission reminders come in super handy. You’ve probably seen them before, but in case you haven’t, they are usually at the top of the email and often go like this: - -_“You are receiving this message because you signed up to be a member of the beer of the month club at Downtown Brewery”._ - -This little block of text provides your recipients with a gentle reminder that they did give you their address and it’s ok that you are sending them messages. The huge benefit of using permission reminders is the potential for increased deliverability. Deliverability can go up because recipients are much less likely to flag your content as spam when they remember they signed up to receive your messages. - -There are a few things to keep in mind as you craft your own permission reminder. First, make sure your reminders are specific as to where and what the customer signed up to receive when their address was first collected. Avoid vague phrases such as “because you are a customer”, “because you expressed interest”, or “because of your relationship with X”. These phrases will only make your recipient further question you as a sender. Instead, provide the specifics: - -* _“Because you dined at our restaurant and signed up for our newsletter with a server...”_ -* _“Because you visited our website and signed up to receive daily deals...”_ -* _“Because you support public radio and signed up on our website to receive notifications of volunteer opportunities in your area...”_ - -The more information you provide your customer, the more they will trust you. - -Another cool thing about permission reminders is that they can also include an unsubscribe link and a request to add your address to the recipient's address book. Recipients that can easily locate your unsubscribe link are less likely to report your message as spam. No one likes to scour pages and pages looking for a tiny unsubscribe link; the spam button in the recipient's email client is much easier to find. Put the permission reminder and unsubscribe link at the top of your message, or make it highly visible near the bottom. It’s in your best interest to make unsubscribing as easy as possible. - -Bottom line: if you aren’t including a well written permission reminder in your messages, you are leaving increased deliverability on the table. Use a specific, detailed permission reminder to combat forgetfulness and spam complaints, while helping recipients remember your brand and stay engaged! diff --git a/source/Classroom/Deliver/Address_Lists/why_purchased_email_lists_are_no_good.md b/source/Classroom/Deliver/Address_Lists/why_purchased_email_lists_are_no_good.md deleted file mode 100644 index 6570a3151d..0000000000 --- a/source/Classroom/Deliver/Address_Lists/why_purchased_email_lists_are_no_good.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -seo: - title: Problems With Purchased Email Lists - description: Why Purchased Email Lists Are No Good - keywords: purchase, honey, pot, spam report, spam traps, purchased, lists -title: Problems With Purchased Email Lists -weight: 0 -layout: page -zendesk_id: 200182878 -navigation: - show: true ---- - -{% anchor h2 %} -The bottom line -{% endanchor %} - -As an email service provider striving to provide our customers the highest level of email deliverability possible, SendGrid does not allow sending to email lists that are purchased, rented, or acquired from 3rd party sources without the explicit consent of every recipient on that list. This policy is intended to protect both our business and your own. - -{% anchor h3 %} -Why should you care? -{% endanchor %} - -Purchased lists are almost always of poor quality. They are plagued with old addresses, and often contain [spam traps or honeypots]({{root_url}}/Classroom/Deliver/Undeliverable_Email/spam_trapped.html). Sending to these lists will result in only a fraction of your emails being successfully delivered, with an even a smaller fraction being opened. We say _disinterested recipients_ because recipients on a purchased list have not opted into receiving your marketing emails. - -In addition to the short term impacts of purchased recipient lists, sending email to purchased lists that contain spam traps and honey pots can have a long term negative impact on your sender reputation. It may take months, even years, to rebuild a positive sending reputation. - -{% info %} -Sending email to purchased lists gives your business a bad reputation. -{% endinfo %} - -If you were to receive someone else’s emails without ever having heard of or signed up for their products or services, wouldn’t you be a little bit peeved? Nowadays, everyone has a lot to keep track of— especially concerning email. Extra, unsolicited marketing email is just a nuisance. - -The optimal way to grow your business via email is to build a community of people who have explicitly expressed interest in your service or product by submitting their email address voluntarily. - -{% anchor h3 %} -Why do we care? -{% endanchor %} - -We care about your business. As part of our mission to make email better, we want you and your business to succeed by maximizing the effectiveness of the emails that you trust us to deliver. - -Our reputation suffers with yours. Since we provide the IP space for your email to be sent on, your sending has a direct impact on our own industry reputation. When your email is sent with negative results, we are then burdened with a poor reputation as well. We strive to maintain excellent relationships with ISPs and other partners in the email industry in order to provide you the best email deliverability possible, but in order to do this we must set high standards and firm requirements for the quality of email that we agree to send. - -Ultimately, sending to purchased lists hurts your deliverability and our reputation. Consequently, the deliverability and reputation of other SendGrid users is harmed as well. - -{% anchor h2 %} -Alternatives to purchased recipient lists -{% endanchor %} - -Every time a sender breaks our [Terms of Service](https://sendgrid.com/email_policy.html) by purchasing a list, the justification is always the same: “to grow their recipient list.” This is understandable, since senders rarely have malicious intent the list advertisers make it sound like the recipients are genuinely interested. - -Gaining exposure to potential buyers and promoting products is essential to the success of any business, but doing so via purchased recipient lists won't work. To put it simply, sending promotional emails to these lists is spamming. - -A common misconception is that the greater quantity of recipients means greater results. The truth is that quality is the anthem of success. A list full of engaged and excited recipients will yield a sender far better results. However, customers’ attention cannot be bought; it must be earned. - -{% anchor h3 %} -How to grow a healthy recipient list with great results -{% endanchor %} - -1. The closest alternative is co-registration with relevant partner ventures. This is basically promoting your own site or organization through the opt-in process of similar businesses. This should be done clearly and explicitly in the opt-in process as opposed to a small pre-checked box that demonstrates their interest in your organization. Explicit opt-in will always yield the best results. - -2. Get out there and promote. This could be a sign up in a store or through a conference of people that are already interested in your area of work. Think about where the people that could be interested and go to them. But be wary of handwritten sign up forms or verbal exchanges which are often plagued with typos or illegible addresses. This puts the sender in danger of sending to email addresses that are uninterested in their content as well as causing the sender to miss out on possible interest in what they are promoting. A better alternative is to have electronic sign ups on a computer or some sort of electronic device. - - That said, the more easy and accessible the opt-in form, the more likely people are to sign up. Keep it simple and be clear as to what you are going to be sending. Make your registration form stand out, people should not have to search for it. Remember to keep it secure with these [tips]({{root_url}}/Classroom/Basics/Security/keeping_your_registration_form_secure.html). - -3. Think about what your expertise is and share it by writing an e-book! This is a great way to inform people about your industry and what you might have to offer them. - -4. Try mobile! Try putting in a separate opt-in on your website where people can opt-in to text or SMS alerts for new deals or promotions that you have. - -5. Facebook is another great way to promote your business. Set up a Facebook page to connect with your recipients and promote in fun ways like contests and giveaways. Reward your loyal followers. Put a email registration form on your page to strengthen your connection. Make sure that there are benefits to joining the email list such as a personal birthday promotion. - -6. Make it easy for your fans to promote your organization. Add a simple form to your website where fans can send an invite or just let their friends know about what you have to offer. But first, swing by our [guidelines]({{root_url}}/Classroom/Deliver/Address_Lists/peer_initiated_email_invitation_requirements.html) to make sure that your campaign will be done safely and successfully. - -7. Keep your content captivating. Think about who you are sending to and what they would be interested in. The key to successful promotion is to find the people that will be excited about what you offer. Those are the people that spread your ideas. Seth Godin released a helpful [checklist](http://sethgodin.typepad.com/seths_blog/2008/06/email-checklist.html) to run through every time an email is sent that will help you make sure you deliver great content. diff --git a/source/Classroom/Deliver/Delivery_Introduction/IP_reputation_montoring.md b/source/Classroom/Deliver/Delivery_Introduction/IP_reputation_montoring.md deleted file mode 100644 index d872eb1e8b..0000000000 --- a/source/Classroom/Deliver/Delivery_Introduction/IP_reputation_montoring.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -st: - published_at: 2016-05-26 - type: Classroom -seo: - title: Do you offer reputation monitoring for dedicated IP accounts? - description: Need reputation monitoring for your dedicated IP? - keywords: IP, reputation, monitoring, monitor, dedicated -title: Do you offer reputation monitoring for dedicated IP accounts? -weight: 0 -layout: page -navigation: - show: true ---- - -As it turns out, SendGrid does not offer dedicated IP address reputation monitoring as a service. We do not manage the reputation of your dedicated IP address since only your mail is being sent via your dedicated IP. This means that you have ultimate control over the content that is being sent out and therefore are responsible for monitoring and maintaining its reputation and listing status. However, there are many services that can help you maintain your IP’s reputation. - -The following are some third party tools available to assist you in maintaining your reputation: - -* [250ok](https://250ok.com/tools/blacklists/) -* [Return Path](https://returnpath.com/request-a-demo-social/?sfdc=701000000006Za6&gclid=CIO88sevkcwCFRSPfgod6u8AXA) -* [Sender Score](https://www.senderscore.org/blacklistlookup/) - -In addition, SendGrid does offer [Delivery Consultation](https://sendgrid.com/marketing/delivery-consult/) services to Pro and Premier accounts that can help with deliverability and on-boarding. Services include how to maintain/improve domain and IP reputation, reviewing message content, dedicated IP configuration, and creating a custom IP warm-up plan just to name a few. diff --git a/source/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.md b/source/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.md deleted file mode 100644 index 80266d9950..0000000000 --- a/source/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -seo: - title: All You Need to Know About Whitelabeling - description: All You Need to Know About Whitelabeling - keywords: silver, cname, spf, dkim, on behalf, via, whitelabel, dns, IP, account, txt -title: All You Need to Know About Whitelabeling -weight: 0 -layout: page -zendesk_id: 200548228 -navigation: - show: true ---- - - **Overview** -Have you ever noticed that email you send through your SendGrid account displays “sent on behalf of” or “via sendgrid.me” as the message signing entity and wondered how to get rid of it? Depending on your package type, you may have access to a very useful feature that we refer to as whitelabeling. So, what is it? Whitelabeling is a process that allows you to mask SendGrid as your relay point in all of your emails and replace it with your domain. This can be accomplished with the addition of a few new DNS records and can lead to a better sending reputation and more consistent inbox delivery. - -**Who?** -All users have access to Domain and Link whitelabeling. Pro plans and higher will have access to IP whitelabeling as well. - -**How?** -The whitelabeling process involves the creation of several new DNS records which establish a new subdomain in your domain registrar. When creating this new subdomain it is very important to choose one that has not yet been established within your DNS settings in order to avoid conflicting records. We also highly recommend that you do not choose “sendgrid” as your subdomain, since doing so would defeat the purpose of whitelabeling! - -These records all work in tandem in order to remove SendGrid as the message signing entity and display your chosen subdomain as the authenticated sender. Please refer to our [User Guide]({{root_url}}/User_Guide/Settings/Whitelabel/index.html) for helpful video tutorials and more information on the process and required DNS records. - -**The Records** -To complete the whitelabeling process, you will need to create DNS records within your domain's DNS settings. - -# **1. [SPF Record](http://en.wikipedia.org/wiki/Sender_Policy_Framework) (Sender Policy Framework)** - -What it should look like: - -> **TXT (yourdomain) v=spf1 include:uXXXXXX.wl.sendgrid.net -all** - -A Sender Policy Framework record states what domains and IPs are allowed to send on your behalf. If SendGrid is not included in your SPF record then we will not be able to send on your behalf and you will probably receive bounces pertaining to authentication issues. If you already have an existing SPF record for your domain then you will just need to append “include:sendgrid.net” to that current record at the end, but before the “all” mechanism. - -# **2. [CNAME Record](http://en.wikipedia.org/wiki/CNAME) (Canonical Name)** - -Several CNAME records are required in order to complete the Whitelabel process. Three CNAME records are required during the Domain Whitelabel process, all of which are used to provide a tight level of security to your outbound sending: - -What it should look like: - -> **CNAME (subdomain).(domain) (youruserid).wlXXX.sendgrid.net** -> -> **CNAME s1.\_domainkey.(domain) s1.domainkey.(youruserid).wlXXX.sendgrid.net (data)** -> -> **CNAME s2.domainkey.(domain) s2.domainkey.(youruserid).wlXXX.sendgrid.net (data)** - -If you want to Whitelabel your Email Links as well for click-tracking and redirect purposes you will need to add two additional CNAME records. One is used to for security (ownership validation) while the other is responsible for the actual redirecting of mail traffic. Both are required to complete the Email Link validation. - -You cannot use the same subdomain for your Email Links as that of your Domain. Whitelabel DNS prevents users from having a CNAME record with the same subdomain.rootdomain combo pointing to different locations, hence the necessity of utilizing a different subdomain for link tracking. - -> **CNAME (subdomain).(domain) --> sendgrid.net** -> -> **CNAME (youruserid).(domain) --> sendgrid.net** - - -# **3.** **A Record (Address)** - -The A record is what links your dedicated IP address back to your chosen subdomain. Creating this record will point traffic for o1.subdomain.yourdomain.com back to your dedicated IP, and vice versa. You can create multiple A records for a domain with as many IP addresses as you wish, however you can only whitelabel one IP to one domain at a time. - -What it should look like: - -> **o1.subdomain.yourdomain.com. | A | 86.75.30.9** - -All of the DNS records are created within the Settings > Whitelabels within your SendGrid account. You will be presented with the tools to whitelabel domains, email links and also your dedicated sending IP addresses (Pro accounts and higher). Next, you will want to add these records to your DNS settings. Depending on your hosting provider, the time it takes for these new records to propagate publicly will vary between 10 minutes and up to 48 hours. - -After those records have become public facing you will be able to verify them within the Whitelabel settings section of your SendGrid account. If you notice that any records are not validating after you have added them to your DNS settings then it means that either the record was improperly configured or it has not become public yet. For more help with validating your whitelabel DNS records, see [here]({{root_url}}/Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.html). - -We understand that this process can be challenging, especially on the first attempt, so if you continue to have any questions or concerns about whitelabeling after taking a look at our other resources, please feel free to contact our support team. We’re here to help! diff --git a/source/Classroom/Deliver/Delivery_Introduction/creating_and_whitelabeling_a_subuser_to_a_new_sending_domain.md b/source/Classroom/Deliver/Delivery_Introduction/creating_and_whitelabeling_a_subuser_to_a_new_sending_domain.md deleted file mode 100644 index ca9406d4ed..0000000000 --- a/source/Classroom/Deliver/Delivery_Introduction/creating_and_whitelabeling_a_subuser_to_a_new_sending_domain.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -seo: - title: Creating & Whitelabeling A Subuser To A New Sending Domain - description: Creating & Whitelabeling A Subuser To A New Sending Domain - keywords: subuser, subaccount, whitelabel, dns, IP, account, domain -title: Creating & Whitelabeling A Subuser To A New Sending Domain -weight: 0 -layout: page -zendesk_id: 200181928 -navigation: - show: true ---- - -This article outlines how to create a new Subuser and how to Whitelabel that Subuser to a new sending domain. In order to Whitelabel a new Subuser to a new sending domain, you must have already purchased a new sending IP from SendGrid. **An IP can be Whitelabeled to only one sending domain**. If you need to send mail on behalf of several domains, you need to purchase an IP for each of these domains. Additional IPs will cost an 20USD per month/per IP charge, but can be added as needed. Please contact the SendGrid Support Team by chat, email, or phone to purchase a new sending IP. - - - -Once you have your new IP you are ready to create the Subuser and Whitelabel the Subuser to the new sending domain. First you need to navigate to the [Subuser Management Page](http://sendgrid.com/subuser) where you can view current Subusers and create new Subusers. Towards the top of the page, select to create a New Subuser. - -**Note:** The Subuser creation process must be completed in a single go, including the validation of all DNS records. If you exit the Subuser creation process or log out of your account, you need to go through all steps in order to get back to where you were. Accounts are not created until Step 6 so you can use the same username and information when going back through the Wizard. - - - -**Step 1 - Subuser Information:** Enter all account information for the new Subuser. Ensure the Email Address you enter is a valid address that is checked periodically. This is the address used if there is ever a need for us to get in touch with you. - - - -**Step 2 - IP Selection:** Select the new, Unwhitelabeled IP you just purchased on this page. The 'In Use' column reads 'No' for the new IP you just purchased. If you select the parent account IP or any other previously Whitelabeled IP, you will overwrite the existing rDNS on that other IP. If you are unsure which IP to use, feel free to contact our Support team. - - - -**Step 3 - Quick Setup:** You are given the option to create a new whitelabel entry or to keep the parent account Whitelabel. Select the option to 'create a new whitelabel entry'. - -** ** - -**Step 4 - Quick Setup:** Enter the new domain you need to send mail out from and then enter the Privacy Policy URL for that domain. Just enter the root domain, i.e. sendgrid.com, rather than a full URL such as [http://www.sendgrid.com](http://www.sendgrid.com) - - - -**Step 5 - DNS Validation:** You are now provided with all the DNS changes necessary to Whitelabel the new sending domain. You do need to create a subdomain and add all DNS records to the new domain. Our system defaults with 'email' as the subdomain but you can change this to anything you need. Do not overwrite or delete any existing records in order to add these new records. Once all the records are up, use the Validate and Confirm button to see if the records have propagated yet. You are not allowed past this page until all records can be found by our system. If you feel the records are up and our system cannot locate them, please contact the SendGrid Support Team and be ready to provide us with a screenshot. - -For more info, check out our [Whitelabel Wizard](http://sendgrid.com/docs/VidGrid/Whitelabel/whitelabel.html) documentation. - - - -**Step 6 - Confirm Settings:** Congratulations! Once you reach this page all information is correct and you need only click the final Confirm button to create your Subuser which is Whitelabeled to a new sending domain. - - - -Please follow [SendGrid's IP Warmup Guide](http://sendgrid.com/docs/User_Guide/warming_up.html) in order to help this new IP establish its sending reputation which determines your deliverability. - diff --git a/source/Classroom/Deliver/Delivery_Introduction/email_deliverability_101.md b/source/Classroom/Deliver/Delivery_Introduction/email_deliverability_101.md index 69acacaef3..9b0125fdef 100644 --- a/source/Classroom/Deliver/Delivery_Introduction/email_deliverability_101.md +++ b/source/Classroom/Deliver/Delivery_Introduction/email_deliverability_101.md @@ -87,7 +87,7 @@ Encouraging your recipients to do certain things can help bolster the trust ISPs - "Add us to your address book!" - Having a recipient add your from address you their address book or trusted senders list can go a long way. More often than not, if one of an ISPs recipients trust a sender, they will be more lenient to similar messages to different recipients! - Star or Mark as important - A simple inbox action like this is just another way your recipients can tell their mail providers that "Hey, I want these messages". -- IP Whitelist - Some ISPs or mail admins can add rules to always allow _all_ incoming mail from specific IP addresses! Consider reaching out to the postmaster(usually postmaster@thedomain.com) of problematic mail domains to see if they can white list [your dedicated IP address]({{root_url}}/Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.html). +- IP Whitelist - Some ISPs or mail admins can add rules to always allow _all_ incoming mail from specific IP addresses! Consider reaching out to the postmaster(usually example@example.com) of problematic mail domains to see if they can white list [your dedicated IP address]({{root_url}}/Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.html). - "If you don't receive an email right away, please check your spam folder and mark "not spam"" - Adding this simple sentence to your sign-up form area can solve a lot of potential heartache. If a message you sent ends up in the Spam folder, and the recipient manually goes in and pulls it out, that's fantastic! This not only helps an ISPs incoming mail filters in avoiding false positives, but also improves your standing with that ISP. {% anchor h3 %} diff --git a/source/Classroom/Deliver/Delivery_Introduction/ip_warmup_schedule.md b/source/Classroom/Deliver/Delivery_Introduction/ip_warmup_schedule.md deleted file mode 100644 index 0efe575cdf..0000000000 --- a/source/Classroom/Deliver/Delivery_Introduction/ip_warmup_schedule.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -st: - published_at: 2016-07-12 - type: Classroom -seo: - title: IP Warmup Schedule - description: Get guidance on planning your sending strategy, and help identifing potential weaknesses in your email program... - keywords: IP, warm, up, warmup, getting, started, ramp, ramping - canonical: https://sendgrid.com/docs/assets/IPWarmupSchedule.pdf -title: IP Warmup Schedule -weight: 0 -layout: page -navigation: - show: true ---- - - -##IP Allocation and IP Warmup Schedule - -###It is important to note an IP warmup plan is merely a way to help the sender identify potential weaknesses in their email program. Starting slowly gives the sender a chance to pause or slow down sending and adjust their strategy before their reputation is severely impacted. -
    -
    -{% anchor h1 %} -IP Allocation -{% endanchor %} - -**How many IPs should I have?** (Suggested IP count is based on desired daily sending volume) - -| No. of IPs | Target Daily Volume | -|------------|---------------------| -| 2 | 25,000 | -| 2 | 50,000 | -| 2 | 100,000 | -| 2 | 200,000 | -| 2 | 400,000 | -| 2 | 800,000 | -| 3 | 1,600,000 | -| 3 | 2,500,000 | -| 4 | 3,500,000 | -| 5 | 5,000,000 | -| 7 | 7,500,000 | -| 10 | 10,000,000 | -| 11 | 12,500,000 | -| 12 | 15,000,000 | -| 13 | 20,000,000 | -| 15 | 30,000,000 | -| 17 | 50,000,000 | -| 20 | 80,000,000 | - -The number of IPs needed to accommodate your sending volume can change based on your type of sending, the domains to which you are sending, and your sending reputation. -
    -
    -
    -{% anchor h1 %} -IP Warmup Schedule -{% endanchor %} - -**Sending volume ramp up schedule** (Regardless of IP count) - -| Day | Daily Volume | -|-----|--------------| -| 1 | 50 | -| 2 | 100 | -| 3 | 1,000 | -| 4 | 5,000 | -| 5 | 10,000 | -| 6 | 50,000 | -| 7 | 200,000 | -| 8 | 500,000 | -| 9 | 800,000 | -| 10 | 1,000,000 | -| 11 | 1,600,000 | -| 12 | 2,000,000 | -| 13 | 3,000,000 | -| 14 | 4,500,000 | -| 15 | 7,000,000 | -| 16 | 9,000,000 | -| 17 | 12,000,000 | -| 18 | Double Sending Volume Daily | - -Ideal warm up schedules can vary greatly depending on a number of factors including: List age, list hygiene, spam reports, user engagement, domain reputation, content, domain distribution, and other factors. diff --git a/source/Classroom/Deliver/Delivery_Introduction/keep_in_touch_the_importance_of_engagement.md b/source/Classroom/Deliver/Delivery_Introduction/keep_in_touch_the_importance_of_engagement.md deleted file mode 100644 index e18ffa359e..0000000000 --- a/source/Classroom/Deliver/Delivery_Introduction/keep_in_touch_the_importance_of_engagement.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -seo: - title: Keep In Touch, The Importance of Engagement - description: Keep In Touch, The Importance of Engagement - keywords: event, frequency, cleaning, engagement, spam traps, lists -title: Keep In Touch, The Importance of Engagement -weight: 0 -layout: page -zendesk_id: 200182988 -navigation: - show: true ---- - -A common problem for senders is when a recipient will opt-in to receive their emails but after a certain period of time, these opted in emails do not make it to the mailbox. Worse, this leads to recently opted in addresses missing out on this senders emails as well. These addresses have opted in so what is the issue? - -Monitoring engagement is the best tool in ensuring a good reputation as a sender. In the past few years, there has been a large push in determine whether emails will make it to the mailbox by past engagement with that sender. Popular receiving mailboxes like [Gmail](http://www.youtube.com/watch?v=5nt3gE9dGHQ), Yahoo! and [Hotmail](http://www.youtube.com/watch?v=NHVQD6Sddtg) all use engagement tracking to decipher for their users which emails to put in the spam folder, bounce, or allow passage to a user's mailbox. Furthermore, many mailboxes now have the option to prioritize emails automatically so that there are two different categories of email; those deemed by the mailbox as important and those that aren't. This is almost entirely determined by whether or not recipients click on their emails or even better, if they reply. This increases the ante for senders to send content that recipients will engage with. - -Thankfully SendGrid provides a window into the problem. Senders on the Essentials, Pro, or Premier plans are able to make use of the [Event API](http://sendgrid.com/docs/API_Reference/Webhooks/event.html) which allows senders to know if recipients have opened and/or clicked on their emails. Lower tier plans can view this information under the Email Activity tab. With these tools, a sender can ensure that they are not sending to two major pitfalls: [spam traps]({{root_url}}/Classroom/Deliver/Undeliverable_Email/spam_trapped.html) or recipients that are likely to acknowledge the email as spam. Sending to either of these recipients leads the receiving mailbox to believe that they are uninterested and therefore, begin to divert their emails to the unimportant or spam folders. - -Monitoring engagement provides a sustainable solution to sending that leaves both the sender and the recipients better off. diff --git a/source/Classroom/Deliver/Delivery_Introduction/russian_data_localization_law.md b/source/Classroom/Deliver/Delivery_Introduction/russian_data_localization_law.md index 49939b6719..0d6aae7753 100644 --- a/source/Classroom/Deliver/Delivery_Introduction/russian_data_localization_law.md +++ b/source/Classroom/Deliver/Delivery_Introduction/russian_data_localization_law.md @@ -74,13 +74,7 @@ The following organizations can provide additional information and further actua **Sources and Additional Reading:** * [http://uk.practicallaw.com/2-502-2227#a452067](http://uk.practicallaw.com/2-502-2227#a452067) -* [http://www.rapsinews.com/tags/tag_FederalServiceforSupervisionofCo -mmunications/] (http://www.rapsinews.com/tags/tag_FederalServiceforSupervisionofCo -mmunications/) -* [http://www.lexology.com/library/detail.aspx?g=9c043a6a-d4ee-41c1- -acf1-15a433e2c84f] (http://www.lexology.com/library/detail.aspx?g=9c043a6a-d4ee-41c1- -acf1-15a433e2c84f) +* [http://www.rapsinews.com/tags/tag_FederalServiceforSupervisionofCommunications/] (http://www.rapsinews.com/tags/tag_FederalServiceforSupervisionofCommunications/) +* [http://www.lexology.com/library/detail.aspx?g=9c043a6a-d4ee-41c1-acf1-15a433e2c84f] (http://www.lexology.com/library/detail.aspx?g=9c043a6a-d4ee-41c1-acf1-15a433e2c84f) * [https://community.oracle.com/thread/3659170] (https://community.oracle.com/thread/3659170) -* [http://www.cityam.com/218299/why-russia-s-new-data-law-targeting- -google-facebook-and-twitter-will-cost-its-economy] (http://www.cityam.com/218299/why-russia-s-new-data-law-targeting- -google-facebook-and-twitter-will-cost-its-economy) +* [http://www.cityam.com/218299/why-russia-s-new-data-law-targeting-google-facebook-and-twitter-will-cost-its-economy] (http://www.cityam.com/218299/why-russia-s-new-data-law-targeting-google-facebook-and-twitter-will-cost-its-economy) diff --git a/source/Classroom/Deliver/Delivery_Introduction/segment_your_email_traffic_with_subusers.md b/source/Classroom/Deliver/Delivery_Introduction/segment_your_email_traffic_with_subusers.md deleted file mode 100644 index d3267a9146..0000000000 --- a/source/Classroom/Deliver/Delivery_Introduction/segment_your_email_traffic_with_subusers.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -seo: - title: Segment Your Email Traffic with Subusers - description: Use subusers to segments your mail streams more precisely... - keywords: segmentation, subuser, silver, subaccount, account -title: Segment Your Email Traffic with Subusers -weight: 0 -layout: page -navigation: - show: true ---- - -If you have a Pro or Premier account at SendGrid then you have the ability to segment your email traffic with us through a combination of subuser accounts and whitelabels. Account segmentation is usually done to keep [marketing]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html) and [transactional]({{root_url}}/Glossary/transactional_email.html) email traffic separate. This allows for more organized and useful statistics, and an easier understanding of account performance. It also allows for individualized settings and feature management on a per account basis. Segmentation can even be established at the IP level, which, when combined with subusers, can fully separate email traffic so that they are separate entities all together. - -## Basic Subuser Segmentation -The first way to segment your email traffic involves creating a subuser. Let's say you have both marketing and transactional emails going out of the same account. By creating a subuser you can choose to move either your marketing or transactional traffic and send it separately through this new subuser account. This would allow you to keep the two types of email traffic separated for the most part; separate statistics for marketing and transactional email traffic, separate account-based features and application management, and separate credentials in order to control each account's traffic flow. -{} -- Allows for separation of email traffic -- Separation of features and settings -- Separation of statistics - -## Subuser Segmentation with an Additional IP Address - -If you have the ability to create subusers then you also have the ability to [purchase additional dedicated IP addresses]({{root_url}}/Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.html) for $20 each per month. The more reliable way to segment your email traffic involves creating a new subuser and purchasing a new IP address through which to send this subuser's traffic. This type of segmentation allows for complete separation of your email traffic. By adding a new, dedicated IP address to this new subuser you are not only able to keep separate stats, settings, and traffic, but you also have separate IP reputations, as well as the ability to create separate [whitelabel]({{root_url}}/Classroom/Basics/Whitelabel/index.html) settings for each account. This is a very crucial aspect of segmentation for users who want to ensure that their marketing emails do not negatively affect their other streams of traffic. - -- Allows for complete separation of email traffic -- Separation of application and features per account -- Easier statistics separation -- Account individual IP reputation -- Control individual domain reputation - -{% info %} -You can also use our [IP Pooling feature]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_pools.html) to help you segment your traffic. More information can be found [here]({{root_url}}/Classroom/Send/Who_You_Can_Send_To/segmenting_traffic.html). -{% endinfo %} diff --git a/source/Classroom/Deliver/Delivery_Introduction/unsubscribes_explained.md b/source/Classroom/Deliver/Delivery_Introduction/unsubscribes_explained.md index 6b626be91d..6113604752 100644 --- a/source/Classroom/Deliver/Delivery_Introduction/unsubscribes_explained.md +++ b/source/Classroom/Deliver/Delivery_Introduction/unsubscribes_explained.md @@ -53,5 +53,5 @@ Be careful when removing recipients from your unsubscribe lists in order to send **Would You Like to Know More?** -Still a little unsure on the particulars? If so, please don't hesitate to contact our support team at your convenience and we will be happy to help! +Still a little unsure on the particulars? If so, please don't hesitate to [contact support](https://support.sendgrid.com) at your convenience and we will be happy to help! diff --git a/source/Classroom/Deliver/Delivery_Introduction/warming_up_ips.md b/source/Classroom/Deliver/Delivery_Introduction/warming_up_ips.md deleted file mode 100644 index 958a911e3c..0000000000 --- a/source/Classroom/Deliver/Delivery_Introduction/warming_up_ips.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -st: - published_at: 2017-04-12 - type: Classroom -seo: - title: Warming Up an IP Address - description: Learn about the importance of warming up your IP addresses, and advice on how to do it... - keywords: warm, up, warmup, auto, automatic, manual api, v3, ip, pool, warmup, pools -title: Warming Up an IP Address -weight: 0 -layout: page -navigation: - show: true ---- - - -Whether you are new to the email game or are an accomplished vet, you have probably run across the idea of warming up an [IP address]({{root_url}}/Glossary/ip_address.html) to improve delivery performance. [Warming up your IP]({{root_url}}/Glossary/ip_warmup.html) allows you to gradually establish a good [sender reputation]({{root_url}}/Classroom/Basics/Misc/your_reputation_what_is_it.html), and is a critical step for new SendGrid users or users who are adding a new dedicated IP address to their account. - - - - - -{% anchor h2 %} -What does it mean to "warm up" an IP address? -{% endanchor %} - -IP warming is the practice of gradually increasing the volume of mail sent via a dedicated IP address according to a predetermined schedule. This gradual process helps to establish a reputation with ISPs (Internet Service Providers) as a legitimate email sender. - -When an ISP observes email suddenly coming from a new or "cold" IP address, they will take notice and immediately begin evaluating the traffic coming from that IP. Since ISPs treat email volume as a key determining factor when detecting spam, it is best to begin sending a low to moderate volume, eventually working your way up to larger volumes. This gives the receiving email providers a chance to closely observe your sending habits and record how your recipients engage with your email. - -Please note that a gradual ramping warm up does not always guarantee a perfect sending reputation. It is still important to follow sending [best practices](https://sendgrid.com/blog/10-tips-to-keep-email-out-of-the-spam-folder/). Remember to always: - -- Send content that your users want, and have explicitly opted-in to receive -- Practice proper contact list hygiene by removing unengaged users -- Send email at a consistent and appropriate frequency - -If you are sending email from a new IP address, ISPs have no means of determining your [sender reputation]({{root_url}}/Classroom/Basics/Misc/your_reputation_what_is_it.html). Since this reputation determines whether or not your emails are delivered to your recipients’ inboxes, it is vital to immediately begin establishing a good reputation. - -{% info %} -Remember that it is much easier to establish a positive reputation as a new sender, than it is to repair an existing reputation. -{% endinfo %} - -If you are sending a very low volume of email (less than 10,000 emails/month), ISPs will probably not pay much attention to your sending habits. However, if you are sending higher volumes, the IP warmup process plays a much more significant role in establishing your reputation. However, we recommend that all users warm up new IP addresses regardless of the amount of email they send. - - - -{% anchor h2 %} -How do I warm up my IP address? -{% endanchor %} - -There are three seperate approaches to warming up a new IP address: - -{% anchor h3 %} -Manually Warm Up your IP -{% endanchor %} - -Gradually send more and more email over your IP address. Please refer to our suggested [IP Warmup Schedule]({{root_url}}/assets/IPWarmupSchedule.pdf) to determine the appropriate rate at which to manually increase the amount of traffic to send through your new IP. - -{% warning %} -New users who are establishing a reputation with their default dedicated IP should manually warm up to attain the best possible reputation going forward. -{% endwarning %} - -{% anchor h3 %} -Automated IP Warmup -{% endanchor %} - -You can place your IP address into [Automated IP Warmup]({{root_url}}/Classroom/Basics/Misc/automated_ip_warmup.html) within the IP Addresses section under Settings, which will automatically throttle traffic sent through your new IP according to our [warm up schedule]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.html). This same step can also be performed using the API, or during the process of [purchasing a new dedicated IP address]({{root_url}}/Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.html). - -{% anchor h3 %} -Automated IP Warmup API -{% endanchor %} - -Place your IP address into warmup mode via our [Automated Warmup API]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup.html) which will automatically throttle traffic sent through your new IP according to our [warm up schedule]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.html). This allows you to add or remove IPs from warmup mode at your discretion. - -{% warning %} -When automatically warming up an IP, SendGrid limits the amount of email sent through that IP per hour. Any email requests that exceed this hourly limit will overflow to any other existing warm IPs on your account. If you do not have any other warm IPs, you will be required to follow the [IP Warmup Guide]({{root_url}}/assets/IPWarmupSchedule.pdf) - -For this reason, we only recommend that users with preexisting, warm IPs use the automatic warm up feature when adding a new dedicated IP address to their account. -{% endwarning %} - - -{% anchor h2 %} -Why don't other ESPs require IP warmup? -{% endanchor %} - -Many other email service providers, especially those focused on marketing email tools, may not offer dedicated IP addresses to their customers. Many ESPs place all of their customers on shared IP groups by default. When sending on a shared IP group, warming up is not usually required. - -While it may be less cost effective and more technically complicated to provide dedicated IPs for our customers, we feel that it is important and empowering for our users to earn their own reputations. This also lets you completely control your own reputation, and prevents your sending from being impacted by the reputations of other SendGrid users. diff --git a/source/Classroom/Deliver/Delivery_Introduction/whitelabel_do_i_need_to_make_dns_changes_pro_and_higher.md b/source/Classroom/Deliver/Delivery_Introduction/whitelabel_do_i_need_to_make_dns_changes_pro_and_higher.md deleted file mode 100644 index d1a34ceb40..0000000000 --- a/source/Classroom/Deliver/Delivery_Introduction/whitelabel_do_i_need_to_make_dns_changes_pro_and_higher.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -seo: - title: Whitelabel - Do I need to make DNS changes? (Pro+) - description: Whitelabel - Do I need to make DNS changes? (Pro+) - keywords: whitelabel, dns, whitelabel_wizard, IP, click_tracking -title: Whitelabel - Do I need to make DNS changes? (Pro+) -weight: 0 -layout: page -zendesk_id: 200181868 -navigation: - show: true ---- - -With Pro and higher level accounts you are issued a brand new, sender neutral, dedicated IP address. Sending from a dedicated IP is a great way to control your sending reputation, because _you, and only you_, control what is sent from it. - -You can take this a step further by completing the Whitelabel and adding a handful of DNS records to your domain. This allows you to control the specific branding of your email to a very fine degree. Here are some things that Whitelabeling allows you to control: - -1. **Domain Whitelabel** - Control the domain that is used in the DKIM and SPF signatures of your email. This helps secure your brand and show receivers that you're above board. -2. **Email Links** - This allows you to set the domain that is surfaced on your Click Tracked links and your Open Tracking pixel -3. **IP Whitelabel** - Since we are the owners of this IP it originally resolves back to SendGrid by default. IP Whitelabel allows you to set the reverse DNS for the IP to match your domain. - - - -![]({{root_url}}/images/makowhitelabel.png) - -![]({{root_url}}/images/makowhitelabel2.png) - -Since an IP will only support a single rDNS name, it's recommended that you use a single IP per unique domain you need to send from. Learn more about adding additional IPs [here]({{root_url}}/Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.html). - -[Subusers]({{root_url}}/Classroom/Basics/Account/what_are_subusers.html) can also be used in conjunction with Whitelabels when sending from multiple domains. Having a single IP assigned to a single Subuser is a great way to segment your traffic. - - - -For specific questions about how to make the required Whitelabel DNS changes to your domain, please contact your website and/or DNS hosting provider. diff --git a/source/Classroom/Deliver/Sender_Authentication/gmail_dmarc_changes.md b/source/Classroom/Deliver/Sender_Authentication/gmail_dmarc_changes.md index 9adebaf0e7..8b236c0079 100644 --- a/source/Classroom/Deliver/Sender_Authentication/gmail_dmarc_changes.md +++ b/source/Classroom/Deliver/Sender_Authentication/gmail_dmarc_changes.md @@ -14,15 +14,15 @@ navigation: show: true --- -Gmail has recently decided to embrace [DMARC](http://sendgrid.com/blog/dmarc-domain-based-message-authentication-reporting-conformance/) more explicitly, much like their email brethren, Yahoo and AOL. You may have started seeing bounce messages with the Reason of: +Gmail has recently decided to embrace [DMARC](http://sendgrid.com/blog/dmarc-domain-based-message-authentication-reporting-conformance/) more explicitly, much like their email brethren, Yahoo and AOL. You may soon start seeing bounce messages with the Reason of: **550 5.7.1 Unauthenticated email from domain.tld is not accepted due to domain's DMARC policy. Please contact administrator of domain.tld domain if this was a legitimate mail. Please visit [https://support.google.com/mail/answer/2451690](https://support.google.com/mail/answer/2451690) to learn about DMARC initiative. 62si14044909itw.103 - gsmtp ** -This is because Gmail will no longer be accepting messages where the From domain is a Gmail address and the message originates from a non-approved Gmail mail domain server/service. This is a security measure they have implemented to help reduce potential address spoofing of their mail domains. +This is because Gmail will no longer be accepting messages where the From domain is a Gmail address and the message originates from a non-approved Gmail mail domain server/service. This is a security measure they will be implementing to help reduce potential address spoofing of their mail domains. -**What this means:** As of June, 2016, you can no longer send with the From address being anything from a Gmail address when sending to a domain that checks DMARC before accepting mail. +**What this means:** Soon, you will no longer be able send with the From address being anything from a Gmail address when sending to a domain that checks DMARC before accepting mail. **What you can do: ** You will need to change the From address you use in emails to a non-Gmail address. We recommend using one at your own mail domain, or one you control that is legitimate. You can then set the Reply-To field to be the original Gmail address that previously was used in the From field. diff --git a/source/Classroom/Deliver/Sender_Authentication/internet_standards_spf_and_dkim_and_deliverability.md b/source/Classroom/Deliver/Sender_Authentication/internet_standards_spf_and_dkim_and_deliverability.md index 2c80a386d6..9543b91bd5 100644 --- a/source/Classroom/Deliver/Sender_Authentication/internet_standards_spf_and_dkim_and_deliverability.md +++ b/source/Classroom/Deliver/Sender_Authentication/internet_standards_spf_and_dkim_and_deliverability.md @@ -11,7 +11,7 @@ navigation: show: true --- -For standards like SPF and DKIM / DomainKeys, whether they improve deliverability or bypass filters is entirely at the discretion of the validating receivers. It is expected that messages from a sender with a good reputation would be subject to less scrutiny by the receiver's filters. [1] In other words, omitting these standards usually doesn't hurt, but providing them can only help deliverability. +For standards like SPF and DKIM / DomainKeys, whether they improve deliverability or bypass filters is entirely at the discretion of the validating receivers. It is expected that messages from a sender with a good reputation would be subject to less scrutiny by the receiver's filters. [1] In other words, omitting these standards usually doesn't hurt, but providing them can only help deliverability. Some other things to consider: diff --git a/source/Classroom/Deliver/Sender_Authentication/microsoft_dmarc_changes.md b/source/Classroom/Deliver/Sender_Authentication/microsoft_dmarc_changes.md index f8812be19d..db508a27bc 100644 --- a/source/Classroom/Deliver/Sender_Authentication/microsoft_dmarc_changes.md +++ b/source/Classroom/Deliver/Sender_Authentication/microsoft_dmarc_changes.md @@ -14,7 +14,7 @@ navigation: show: true --- -Miscrosoft has recently decided to embrace [DMARC](http://sendgrid.com/blog/dmarc-domain-based-message-authentication-reporting-conformance/) more explicitly, much like their email brethren, Yahoo, AOL, and GMail. You may have started seeing bounce messages with the following reasons: +Miscrosoft has recently decided to embrace [DMARC](http://sendgrid.com/blog/dmarc-domain-based-message-authentication-reporting-conformance/) more explicitly, much like their email brethren, Yahoo, AOL, and Gmail. You may have started seeing bounce messages with the following reasons: Hotmail / Outlook / MSN / Live: diff --git a/source/Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.md b/source/Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.md index c6fe2aa581..a4a909eec2 100644 --- a/source/Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.md +++ b/source/Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.md @@ -15,7 +15,7 @@ Many people may not realize it, but the Sender Policy Framework (SPF) specificat Section 10.1, "Processing Limits" of the [SPF RFC](http://datatracker.ietf.org/doc/rfc4408/?include_text=1) specifies the following in regards to DNS lookups: -> SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check, including any lookups caused by the use of the "include" mechanism or the "redirect" modifier. If this number is exceeded during a check, a PermError MUST be returned. The "include", "a", "mx", "ptr", and "exists" mechanisms as well as the "redirect" modifier do count against this limit. The "all", "ip4", and "ip6" mechanisms do not require DNS lookups and therefore do not count against this limit. The "exp" modifier does not count against this limit because the DNS lookup to fetch the explanation string occurs after the SPF record has been evaluated. +> SPF implementations MUST limit the number of mechanisms and modifiers that do DNS lookups to at most 10 per SPF check, including any lookups caused by the use of the "include" mechanism or the "redirect" modifier. If this number is exceeded during a check, a PermError MUST be returned. The "include", "a", "mx", "ptr", and "exists" mechanisms as well as the "redirect" modifier do count against this limit. The "all", "ip4", and "ip6" mechanisms do not require DNS lookups and therefore do not count against this limit. The "exp" modifier does not count against this limit because the DNS lookup to fetch the explanation string occurs after the SPF record has been evaluated. This limit is in place to prevent SPF lookups from being a useful avenue for Denial of Service attacks. diff --git a/source/Classroom/Deliver/Sender_Authentication/spf_records_explained.md b/source/Classroom/Deliver/Sender_Authentication/spf_records_explained.md index f37e15e0de..282d3f50b2 100644 --- a/source/Classroom/Deliver/Sender_Authentication/spf_records_explained.md +++ b/source/Classroom/Deliver/Sender_Authentication/spf_records_explained.md @@ -16,15 +16,13 @@ navigation: Sender Policy Framework (SPF) is an open standard aimed at preventing sender address forgery. This article describes how SPF is configured for use with SendGrid. -##SPF and Whitelabel +##SPF and sender authentication -As part of the whitelabel process you must create a subdomain (such as _email.yourdomain.com_) which is used for click and open tracking as well as in the Return-Path email header. SPF uses the domain value in the Return-Path header for the DNS lookup to determine the permitted senders for the domain. - -If you have an SPF record set for your domain (i.e. yourdomain_.com_) already, you must add a unique alphanumeric string before the _all_ mechanism of this record in order to authenticate mailings through your SendGrid account. If you do not have an existing SPF record for your domain, you must create a TXT record with the value provided to you during the whitelabel creation process. Each SendGrid account gets a unique SPF TXT record to authenticate their outbound mailings. An example of such a record is: +If you have an SPF record set for your domain (i.e. yourdomain_.com_) already, you must add a unique alphanumeric string before the _all_ mechanism of this record in order to authenticate mailings through your SendGrid account. If you do not have an existing SPF record for your domain, you must create a TXT record with the value provided to you during the domain authentication creation process. Each SendGrid account gets a unique SPF TXT record to authenticate their outbound mailings. An example of such a record is: >v=spf1 include:u123456.wl.sendgrid.net -all -In this example we have a unique SPF record for the authorization of outbound mail for a Sendgrid account. A "-all" inclusion versus an "~all" inclusion indicates that this SPF record is the only record used to authenticate mail for your domain. Make sure to include any other authorized sender into this SPF record if you need to authenticate mailings from other sources. +In this example we have a unique SPF record for the authorization of outbound mail for a SendGrid account. A "-all" inclusion versus an "~all" inclusion indicates that this SPF record is the only record used to authenticate mail for your domain. Make sure to include any other authorized sender into this SPF record if you need to authenticate mailings from other sources. Do not create more than one SPF1 record for a given domain. If this is the case, you will want to merge any additional SPF records into one SPF record. You also cannot have [more than 10 DNS lookups]({{root_url}}/Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.html) in your single SPF record. @@ -32,7 +30,7 @@ Do not create more than one SPF1 record for a given domain. If this is the case, ##Already have an SPF record for your domain? -No problem. You simply need to add your Sendgrid account's unique SPF inclusion into your existing record. +No problem. You simply need to add your SendGrid account's unique SPF inclusion into your existing record. For example, say your existing record looks like this: @@ -46,9 +44,9 @@ You would just need to add the SendGrid lookup at the end of the string, before ##Don't want to include another hostname lookup? -If you would rather not include Sendgrid's SPF hostname lookup in your record, or perhaps you just have [too many already]({{root_url}}/Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.html), you can also choose to give permission to a **specific IP address** to send mail for your domain. This is accomplished using the ip4 mechanism within your SPF record. +If you would rather not include SendGrid's SPF hostname lookup in your record, or perhaps you just have [too many already]({{root_url}}/Classroom/Deliver/Sender_Authentication/spf_dont_exceed_ten_dns_lookups.html), you can also choose to give permission to a **specific IP address** to send mail for your domain. This is accomplished using the ip4 mechanism within your SPF record. -You can choose to specify your [dedicated IP address]({{root_url}}/Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.html) as a lookup, which means that only mail coming from that particular IP address will be considered a permitted sender within Sendgrid for that domain. An example of this looks like: +You can choose to specify your [dedicated IP address]({{root_url}}/Classroom/Basics/Account/what_is_my_sending_originating_ip_address_with_sendgrid.html) as a lookup, which means that only mail coming from that particular IP address will be considered a permitted sender within SendGrid for that domain. An example of this looks like: >v=spf1 a mx include:\_spf.google.com include:spf.protection.outlook.com ip4:12.34.56.78 -all diff --git a/source/Classroom/Deliver/Sender_Authentication/what_is_automated_security_in_the_whitelabel_settings.md b/source/Classroom/Deliver/Sender_Authentication/what_is_automated_security_in_the_whitelabel_settings.md deleted file mode 100644 index e9d33b961e..0000000000 --- a/source/Classroom/Deliver/Sender_Authentication/what_is_automated_security_in_the_whitelabel_settings.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -st: - published_at: 2016-05-16 - type: Classroom -seo: - title: What is Automated Security in the Whitelabel settings? - description: What is Automated Security in the Whitelabel settings? - keywords: automated, security, spf, whitelabel, domain, dkim -title: What is Automated Security in the Whitelabel settings? -weight: 0 -layout: page -zendesk_id: 202517236 -navigation: - show: true ---- - -#Automated Security - -![]({{root_url}}/images/automate_security_on.png) - -By enabling Automatic Security on your [domain whitelabels]({{root_url}}/User_Guide/Settings/Whitelabel/domains.html), SendGrid can manage your [DKIM]({{root_url}}/Glossary/dkim.html) and [SPF]({{root_url}}/Glossary/spf.html) records for you. - -Setting up three custom [CNAME records]({{root_url}}/Glossary/cname.html) displayed during whitelabel setup will grant SendGrid the ability to manage custom DKIM keys for your domain. In the future this may be used for periodic DKIM key rotation without requiring you to make additional updates to [DNS]({{root_url}}/Glossary/dns.html). We will also generate a custom SPF that includes only the IPs that you'll be sending from (as opposed to ~all sendgrid.net). - -To clarify, you will still need to create some DNS records initially to allow us to take over this process. The DNS records you'll need to create will depend on whether you chose automated or manual security, the IP addresses on your account, and the domain you are whitelabeling. - - - -#Manual Security - -![]({{root_url}}/images/automated_security_off.png) - -If you choose not to have SendGrid manage your DNS records for DKIM, then you’ll be shown all of the manual DNS records that you need to enter at your registrar or host. You will be responsible for making any updates to your DNS for any changes on your account when selecting this options. - -The records you are given will be MX, DKIM, and SPF records to enter at your registrar, hosting company, or DNS manager. This will also mean that your SPF record will include all of SendGrid’s IP addresses. - -For more information about whitelabeling, please read [All You Need to Know About Whitelabeling]({{root_url}}/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.html), or visit our [User Guide]({{root_url}}/User_Guide/Settings/Whitelabel/index.html). diff --git a/source/Classroom/Deliver/Sender_Authentication/yahoo_dmarc_changes_message_not_accepted_for_policy_reasons.md b/source/Classroom/Deliver/Sender_Authentication/yahoo_dmarc_changes_message_not_accepted_for_policy_reasons.md index 28e2355176..16f3e0f673 100644 --- a/source/Classroom/Deliver/Sender_Authentication/yahoo_dmarc_changes_message_not_accepted_for_policy_reasons.md +++ b/source/Classroom/Deliver/Sender_Authentication/yahoo_dmarc_changes_message_not_accepted_for_policy_reasons.md @@ -15,7 +15,7 @@ _07 April, 2014_ Yahoo mail domains have battened down the hatches, so to speak, and are starting to embrace [DMARC](http://sendgrid.com/blog/dmarc-domain-based-message-authentication-reporting-conformance/) more explicitly. You may have seen an increase in bounce messages with the following explanation: -**"554 5.7.9 Message not accepted for policy reasons. See http://postmaster.yahoo.com/errors/postmaster-28.html" ** +**"554 5.7.9 Message not accepted for policy reasons. See http://postmaster.yahoo.com/errors/postmaster-28.html" ** This is because Yahoo no longer accepts messages where the From domain is a Yahoo mail domain, and the message originates from a non-approved Yahoo mail domain server/service. This is a security measure they have implemented to help reduce potential address spoofing of their mail domains. diff --git a/source/Classroom/Deliver/Undeliverable_Email/google_feedback_loop_spam_complaints.md b/source/Classroom/Deliver/Undeliverable_Email/google_feedback_loop_spam_complaints.md index 45b05f3e24..2b174f9931 100644 --- a/source/Classroom/Deliver/Undeliverable_Email/google_feedback_loop_spam_complaints.md +++ b/source/Classroom/Deliver/Undeliverable_Email/google_feedback_loop_spam_complaints.md @@ -22,7 +22,7 @@ This matters to you because senders with high spam complaints will often see the If you receive a report from us about Google spam complaints, or even from traditional feedback loops, we have a few best practices to help you resolve the issue: 1. If you don’t have opt-in, don’t send any more to those lists. It’s against our [Terms of Service](http://sendgrid.com/email_policy), and considered to be [spam](http://www.spamhaus.org/consumer/definition/) anyway by the email community. -2. If your list is opt-in, track who’s actually engaging with your email, as measured by click and open tracking. Many customer have this data in their own CRM, or you may prefer to use our own [Click](https://sendgrid.com/docs/Apps/click_tracking.html) and [Open Tracking](https://sendgrid.com/docs/Apps/open_tracking.html) apps, coupled with the [Eventkit](http://sendgrid.github.io/eventkit/setup.html) to consume this data. For recipients who don’t engage with your email, after a certain period of time that you determine to be appropriate based on your customer base and business model, stop sending to them. This tends to be a period between a few weeks to 3 months, depending on your sending frequency. +2. If your list is opt-in, track who’s actually engaging with your email, as measured by click and open tracking. Many customer have this data in their own CRM, or you may prefer to use our own [Click](https://sendgrid.com/docs/Apps/click_tracking.html) and [Open Tracking](https://sendgrid.com/docs/Apps/open_tracking.html) apps, coupled with the [EventKit](http://sendgrid.github.io/eventkit/setup.html) to consume this data. For recipients who don’t engage with your email, after a certain period of time that you determine to be appropriate based on your customer base and business model, stop sending to them. This tends to be a period between a few weeks to 3 months, depending on your sending frequency. diff --git a/source/Classroom/Deliver/Undeliverable_Email/how_do_i_keep_emails_from_dropping.md b/source/Classroom/Deliver/Undeliverable_Email/how_do_i_keep_emails_from_dropping.md index 0a73505090..df0dde07d8 100644 --- a/source/Classroom/Deliver/Undeliverable_Email/how_do_i_keep_emails_from_dropping.md +++ b/source/Classroom/Deliver/Undeliverable_Email/how_do_i_keep_emails_from_dropping.md @@ -22,6 +22,6 @@ Easy, check out Address Whitelist! The [Address Whitelist](https://app.sendgrid. ![]({{root_url}}/images/address_whitelist_example.png) -After adding an address or domain to Address Whitelist, you are free to retry attempts to previously dropped addresses. Adding an address here does not automatically re-attempt dropped messages, however. +After adding an address or domain to Address Whitelist, you are free to retry attempts to previously dropped addresses. Adding an address here does not automatically re-attempt dropped messages, however. -_Please note_: You should only use this option when you know the address or domain closely, it is NOT recommended that you add major mail domains such as Gmail or Yahoo, as you can potentially encounter deliverability problems by sending too many messages. _It should also be noted that this app does not guarantee delivery to an address or domain, it simply ensures that Sendgrid never directly interferes with a message attempt._ +_Please note_: You should only use this option when you know the address or domain closely, it is NOT recommended that you add major mail domains such as Gmail or Yahoo, as you can potentially encounter deliverability problems by sending too many messages. _It should also be noted that this app does not guarantee delivery to an address or domain, it simply ensures that SendGrid never directly interferes with a message attempt._ diff --git a/source/Classroom/Deliver/Undeliverable_Email/my_emails_are_being_dropped.md b/source/Classroom/Deliver/Undeliverable_Email/my_emails_are_being_dropped.md index 191316b582..5732dc7394 100644 --- a/source/Classroom/Deliver/Undeliverable_Email/my_emails_are_being_dropped.md +++ b/source/Classroom/Deliver/Undeliverable_Email/my_emails_are_being_dropped.md @@ -23,7 +23,7 @@ Depending on the _reason_ you may want to consider removing the address from you If messages to the recipient **Bounced** with any reason that indicates the account is no longer active or does not exist, you should consider removing the address from your master list. We will continue to Drop future sends to addresses that are on this list, but this still uses email credits. -If the recipient **Unsusbcribed** or marked one of your messages as **Spam** , you should remove the address from your master list as the recipient has indicated they do not wish to receive further mailings. We will continue to Drop future sends to addresses that are on these lists, but this still uses email credits. +If the recipient **Unsubscribed** or marked one of your messages as **Spam** , you should remove the address from your master list as the recipient has indicated they do not wish to receive further mailings. We will continue to Drop future sends to addresses that are on these lists, but this still uses email credits. If the address is **Invalid** you should remove it from your recipient list regardless, as more than likely it is a bogus domain or an inactive mailserver. diff --git a/source/Classroom/Deliver/Undeliverable_Email/my_emails_are_going_to_spam.md b/source/Classroom/Deliver/Undeliverable_Email/my_emails_are_going_to_spam.md index c0cdce7dc3..e43c93ad1a 100644 --- a/source/Classroom/Deliver/Undeliverable_Email/my_emails_are_going_to_spam.md +++ b/source/Classroom/Deliver/Undeliverable_Email/my_emails_are_going_to_spam.md @@ -48,7 +48,7 @@ If you have used a template that generated very bad feedback from recipients, th Sending IP Reputation {% endanchor %} -As you are aware, the IP should be clean, properly warmed up and whitelabeled for your sending domain. Again, it is highly recommended not to mix marketing with transactional messages, as marketing messages generally trigger a higher spam report rate. +As you are aware, the IP should be clean, properly warmed up, with reverse DNS set up. Again, it is highly recommended not to mix marketing with transactional messages, as marketing messages generally trigger a higher spam report rate. {% anchor h2 %} Frequency and User Engagement @@ -57,18 +57,18 @@ Frequency and User Engagement ISPs will always check how your recipients react to your messages (click, open, delete, mark them as spam). If you are sending too many messages to a recipient, then this may be a factor causing bad feedback from the recipient and the messages will go to spam. On the other hand, if a recipient opens messages in a timely manner and engages with them, it can lead to better future delivery! {% anchor h2 %} -Whitelabeling +Sender authentication {% endanchor %} In order to show the ISPs that you are the sender and that you meant to send these messages, the authentication needs to be properly done. -The sending domain needs to be [whitelabeled]({{root_url}}/User_Guide/Settings/Whitelabel/index.html) (so that the SPF and DKIM pass). We highly recommend whitelabeling all of the links that you include in yoru email - as mentioned above, these links should be on your own domain and they shouldn't be blacklisted. +The sending domain needs to be [authenticated]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) (so that the SPF and DKIM pass). We highly recommend branding the links that you include in your email - as mentioned above, these links should be on your own domain and they shouldn't be blacklisted. -If the above guidelines are met (the sending domain matches the whitelabeled domain; the authentication is properly handled, the content is relevant and not using spam triggering words, and the IP is clean and warmed-up) then your messages should start going to inbox. +If the above guidelines are met (the sending domain matches the authenticated domain; the authentication is properly handled, the content is relevant and not using spam triggering words, and the IP is clean and warmed-up) then your messages should start going to inbox. This does not happen overnight, however. It usually takes ISPs up to 30 days to change/assign a reputation for the sending IP or a new domain, and up to 12 months to change the reputation of a domain that they know to have bad sending practices. -Afterwards, you'll want to whitelabel your dedicated IPs and separate your marketing email from your transactional email by using the following format when whitelabeling your sending domains: +Afterwards, you'll want to set up reverse DNS on your dedicated IPs and separate your marketing email from your transactional email by using the following format when authenticating your sending domains: `em.marketing.domain.com` and `em.transactional.domain.com` and use `email@marketing.domain.com` in the from domain rather than the root domain. @@ -78,8 +78,8 @@ This will associate your marketing reputation to the marketing subdomain and you Other Resources {% endanchor %} -- Check out our [Deliverability 101]({{root_url}}/Classroom/Deliver/Delivery_Introduction/email_deliverability_101.html) guide to get started with general guidelines on email ettiquite and sending practices. +- Check out our [Deliverability 101]({{root_url}}/Classroom/Deliver/Delivery_Introduction/email_deliverability_101.html) guide to get started with general guidelines on email etiquette and sending practices. -- After reading our Deliverability 101 guide, take a deep dive into advanced email delivery with [Sendgrid's Official Email Deliverability Guide](https://go.sendgrid.com/Deliverability-Guide-V2.html) +- After reading our Deliverability 101 guide, take a deep dive into advanced email delivery with [SendGrid's Official Email Deliverability Guide](https://go.sendgrid.com/Deliverability-Guide-V2.html) - If you require personalized delivery assistance, get in touch with our Deliverability Consulting team - [you can reach out to them directly here.](https://sendgrid.com/marketing/delivery-consult) diff --git a/source/Classroom/Deliver/Undeliverable_Email/spam_trapped.md b/source/Classroom/Deliver/Undeliverable_Email/spam_trapped.md index 84b393a500..07a8cafb9a 100644 --- a/source/Classroom/Deliver/Undeliverable_Email/spam_trapped.md +++ b/source/Classroom/Deliver/Undeliverable_Email/spam_trapped.md @@ -18,7 +18,7 @@ navigation: Spam Traps are simply ways to identify and monitor spam. Creating them is as easy as taking an email address or even an entire domain that hasn’t been subscribed to any emails and sending an email to it. Since they haven’t subscribed to any mail, it will be considered spam. -There are a wide variety of spam traps. Sources for spam traps are usually old addresses that were used as role addresses (sales@ info@ support@) in domain registrations or email addresses that were once valid but have been reassigned for trapping spam. This type of spam trap has once opted in to receive email and was likely published on a page somewhere online. (This is not that case for dictionary attackers since they generate millions of randomized addresses at common domains i.e. johndoe@gmail.com, johndoe1@gmail.com and so on.) +There are a wide variety of spam traps. Sources for spam traps are usually old addresses that were used as role addresses (sales@ info@ support@) in domain registrations or email addresses that were once valid but have been reassigned for trapping spam. This type of spam trap has once opted in to receive email and was likely published on a page somewhere online. (This is not that case for dictionary attackers since they generate millions of randomized addresses at common domains i.e. example@example.com, example@example.com and so on.) Spam traps are so important because so many large ISPs, spam filter providers and Domain Name System [blacklists]({{root_url}}/Glossary/blacklists.html) use them. In short, sending an email to a spam trap can lead directly to being blacklisted by the organization that set up the trap. Remember that blacklisting can ruin a business’s reputation and halt further email deliverability. @@ -42,6 +42,6 @@ The last important tool in avoiding spam traps is the **age of the list**. Like Removing a spam trap is tricky business not to mention time consuming. It is inefficient and expensive to throw out a whole list and one way to avoid this is [list segmentation]({{root_url}}/Classroom/Deliver/Address_Lists/affiliate_lists_and_list_sharing.html). Identify clean list segments that are free of any possible spam traps. If an address has not opened any emails for over six months, it may be a spam trap and should be sent one last [confirmatory email]({{root_url}}/Glossary/reconfirmation.html). Clean list segments need not be sent a confirmatory email. -Why not repermission the whole list? Because confirming every subscriber’s consent to receive emails isn’t ideal. Subscribers who want to continue to receive mail may not re-subscribe because they did not notice the email or just forgot to reconfirm. +Why not repermission the whole list? Because confirming every subscriber’s consent to receive emails isn’t ideal. Subscribers who want to continue to receive mail may not re-subscribe because they did not notice the email or just forgot to reconfirm. To escape the woes that come with list reconfirmation, remember to ensure thorough and routine list maintenance. This will save time, reputation and a big headache. diff --git a/source/Classroom/Deliver/Undeliverable_Email/what_do_i_do_if_im_blacklisted.md b/source/Classroom/Deliver/Undeliverable_Email/what_do_i_do_if_im_blacklisted.md index f0d201f186..c4551a1c0f 100644 --- a/source/Classroom/Deliver/Undeliverable_Email/what_do_i_do_if_im_blacklisted.md +++ b/source/Classroom/Deliver/Undeliverable_Email/what_do_i_do_if_im_blacklisted.md @@ -14,7 +14,7 @@ navigation: show: true --- -Ending up on a blacklist can be detrimental to your domain’s email deliverability. These days, there are hundreds, maybe thousands of blacklists out there. Some, like the Spamhaus SBL, can bring your email program to a screeching halt. Others are little more than an annoyance. Many of the world's largest inbox providers use blacklists to help them make inboxing and filtering decisions. Others rely only their own internal metrics. Always remember: if a listing service ever asks you pay a fee for a delisting request, or if they say that they do not accept delisting requests, then you should not waste your time trying to get your domain/IP delisted because these services are rarely, if ever, used. However, if you find that your IP address has been blacklisted by one of the many legitimate services, then submitting a delisting request is the top priority. Depending on the level of your account, you should approach a blacklisting in one of two ways: +Ending up on a blacklist can be detrimental to your domain’s email deliverability. These days, there are hundreds, maybe thousands of blacklists out there. Some, like the Spamhaus SBL, can bring your email program to a screeching halt. Others are little more than an annoyance. Many of the world's largest inbox providers use blacklists to help them make inboxing and filtering decisions. Others rely only their own internal metrics. Always remember: if a listing service ever asks you pay a fee for a delisting request, or if they say that they do not accept delisting requests, then you should not waste your time trying to get your domain/IP delisted because these services are rarely, if ever, used. However, if you find that your IP address has been blacklisted by one of the many legitimate services, then submitting a delisting request is the top priority. Depending on the level of your account, you should approach a blacklisting in one of two ways: @@ -22,7 +22,7 @@ Ending up on a blacklist can be detrimental to your domain’s email deliverabil -If you are on one of our shared IP plans and you notice a block message based on one of our IP addresses then please contact our Support team. We will handle all delisting requests for our shared IP users. +If you are on one of our shared IP plans and you notice a block message based on one of our IP addresses then please [contact support](https://support.sendgrid.com). We will handle all delisting requests for our shared IP users. @@ -30,7 +30,7 @@ If you are on one of our shared IP plans and you notice a block message based on -We ask that our dedicated IP plan users make the initial delisting request in the event that they discover their SendGrid IP on a blacklist. These IP addresses are only assigned to one account at a time, so we expect those users to take responsibility for all of the mail that is sent through their account. SendGrid will still be happy to step in and assist with these delisting requests if the listing service requires the IP administrator to take action, or if the delisting form is too complicated. +We ask that our dedicated IP plan users make the initial delisting request in the event that they discover their SendGrid IP on a blacklist. These IP addresses are only assigned to one account at a time, so we expect those users to take responsibility for all of the mail that is sent through their account. SendGrid will still be happy to step in and assist with these delisting requests if the listing service requires the IP administrator to take action, or if the delisting form is too complicated. @@ -73,7 +73,7 @@ Below are links to the delisting forms used by the more popular external blackli - [Trend Micro](https://ers.trendmicro.com/reputations) - [URIBL](https://admin.uribl.com/) -*IMPORTANT NOTE:* If you request a delisting from a blacklisting service, and don't do anything to change the behavior that caused the listing in the first place, it is likely to occur again. Depending on the blacklist, it can be progressively harder to get delisted after the second or third listing. +*IMPORTANT NOTE:* If you request a delisting from a blacklisting service, and don't do anything to change the behavior that caused the listing in the first place, it is likely to occur again. Depending on the blacklist, it can be progressively harder to get delisted after the second or third listing. ###TL;DR: Don't delist from major blacklists without a plan in place to address the issue that caused the listing! [Learn more about how to avoid and mitigate risk of blacklisting here](https://sendgrid.com/blog/avoiding-email-blacklists/). diff --git a/source/Classroom/Deliver/Undeliverable_Email/why_did_my_message_show_as_delivered_first_then_as_bounced.md b/source/Classroom/Deliver/Undeliverable_Email/why_did_my_message_show_as_delivered_first_then_as_bounced.md deleted file mode 100644 index 479b443dd9..0000000000 --- a/source/Classroom/Deliver/Undeliverable_Email/why_did_my_message_show_as_delivered_first_then_as_bounced.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -st: - published_at: 2016-05-17 - type: Classroom -seo: - title: Why did my message show as Delivered first and then as Bounced? - description: Learn what to do when an email address shows events for both Delivered and Bounced... - keywords: delay, delivery, deliver, delivered, after, then, bounce, bounces, bounced -title: Why did my message show as Delivered first and then as Bounced? -weight: 0 -layout: page -navigation: - show: true ---- - -When looking at your [Activity Feed](https://app.sendgrid.com/email_activity?) or in your own [Event data]({{root_url}}/API_Reference/Webhooks/event.html), you may see a very rare occurrence known as a delayed bounce. A delayed bounce occurs when a message is accepted by a recipient server(Delivered) and then is promptly declined(Bounced). SendGrid ultimately treats these messages as a bounce, and any future sends to this address will be dropped. - -If you wish to continue sending to the address that was affected, you will want to remove them from your bounce suppression list by navigating to [Suppressions > Bounces](https://app.sendgrid.com/suppressions/bounces?) and removing the email from the list or removing via API. You can also remove bounces from this list using the API. If you would like more information as why the email bounced, it is best to contact the mail administrator directly for the intended recipient's mail domain, usually postmaster@domain.com. diff --git a/source/Classroom/Deliver/Undeliverable_Email/why_is_sendgrid_net_greylisted.md b/source/Classroom/Deliver/Undeliverable_Email/why_is_sendgrid_net_greylisted.md index 64f16a258e..b2c2516de2 100644 --- a/source/Classroom/Deliver/Undeliverable_Email/why_is_sendgrid_net_greylisted.md +++ b/source/Classroom/Deliver/Undeliverable_Email/why_is_sendgrid_net_greylisted.md @@ -13,4 +13,4 @@ navigation: show: true --- -We are aware that "sendgrid.net" is on a URIBL Greylist and have been monitoring it very closely. We are consistently in contact with the organizers of the list and are working closely to remove "sendgrid.net". Currently, there is no evidence of any actual impact on deliverability due to the greylisting. If you have evidence of blocks or bounces resulting directly because of this listing, please reach out to support [here](https://support.sendgrid.com/hc/en-us). +We are aware that "sendgrid.net" is on a URIBL Greylist and have been monitoring it very closely. We are consistently in contact with the organizers of the list and are working closely to remove "sendgrid.net". Currently, there is no evidence of any actual impact on deliverability due to the greylisting. If you have evidence of blocks or bounces resulting directly because of this listing, please reach out to support [here](https://support.sendgrid.com/hc/en-us). diff --git a/source/Classroom/Deliver/index.html b/source/Classroom/Deliver/index.html index 1a0625e5b7..7d31161f77 100644 --- a/source/Classroom/Deliver/index.html +++ b/source/Classroom/Deliver/index.html @@ -62,20 +62,10 @@ {% endanchor %}

    - Collecting a list of interested and engaged recipients is the first step that you should take to ensure the delivery of your email, and to keep your recipients from reporting your emails as spam. Here are a few tips and tutorials to help guide your recipient, or contact, list management. + Collecting a list of interested and engaged recipients is the first step that you should take to ensure the delivery of your email, and to keep your recipients from reporting your emails as spam. For more information about list management, see our documentation. +.

    - - {% anchor h2 %} Spam {% endanchor %} @@ -144,13 +134,13 @@
{% anchor h2 %} -Whitelabeling +Sender authentication {% endanchor %}

- Whitelabeling is one of the most critical aspects of maintaining your sender reputation. For a complete discussion of whitelabeling, along with a list of all of our whitelabeling documentation, please see the reference linked below. + Sender authentication is one of the most critical aspects of maintaining your sender reputation. For a complete discussion of sender authentication, along with a list of all of our sender authentication documentation, please see the reference linked below.

diff --git a/source/Classroom/Send/How_Emails_Are_Sent/api_keys.md b/source/Classroom/Send/How_Emails_Are_Sent/api_keys.md index 547c5cb9fc..986e003eb0 100644 --- a/source/Classroom/Send/How_Emails_Are_Sent/api_keys.md +++ b/source/Classroom/Send/How_Emails_Are_Sent/api_keys.md @@ -28,6 +28,8 @@ Managing API Keys You can [manage your API Keys]({{site.app_url}}/settings/api_keys) from the SendGrid UI. Additionally, you can [manage your API keys via the API itself]({{root_url}}/API_Reference/Web_API_v3/API_Keys/index.html). +{% info %} There is a limit of 100 API Keys per account. {% endinfo %} + {% anchor h2%} Using API Keys {% endanchor %} @@ -48,14 +50,15 @@ For sending via HTTP using the [v2 mail send]({{root_url}}/API_Reference/Web_API Authorization: Bearer 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 {%endcodeblock%} -Sending an email via a curl request to the v3 mail send endpoint using an API Key would look like: +Sending an email via a cURL request to the v3 mail send endpoint using an API Key would look like: -{%codeblock%} -$curl --request POST \ - --url https://api.sendgrid.com/v3/mail/send \ - --header 'authorization: Bearer YOUR_API_KEY_GOES_HERE' \ - --data '{"personalizations":[{"to":["recipient@example.com"]}],"from":"sender@example.com","subject":"Hello, World!","content":[{"type":"string","value":"Heya!"}]}' -{%endcodeblock%} +${%codeblock%} curl -i --request POST +--url https://api.sendgrid.com/v3/mail/send +--header 'Authorization: Bearer YOUR_API_KEY_HERE' +--header 'Content-Type: application/json' +--data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Howdy!"}]}' {%endcodeblock%} + +Look for a 202 Accepted in the HTTP response headers. {% anchor h3 %} Via a SendGrid Open Source Library diff --git a/source/Classroom/Send/How_Emails_Are_Sent/email_to_sms.md b/source/Classroom/Send/How_Emails_Are_Sent/email_to_sms.md index 450251ac08..32cc234656 100644 --- a/source/Classroom/Send/How_Emails_Are_Sent/email_to_sms.md +++ b/source/Classroom/Send/How_Emails_Are_Sent/email_to_sms.md @@ -21,7 +21,7 @@ Basically, SMTP-to-SMS gateways have narrow bandwidth, due to the need for mobil Here’s a relevant comment about SMS from [RFC 5724](http://www.ietf.org/rfc/rfc5724.txt): > SMS messages very often are delivered almost instantaneously (if the receiving SMS client is online), but there is no guarantee for when - SMS messages will be delivered. In particular, SMS messages between + SMS messages will be delivered. In particular, SMS messages between different network operators sometimes take a long time to be delivered (hours or even days) or are not delivered at all, so applications SHOULD NOT make any assumptions about the reliability diff --git a/source/Classroom/Send/How_Emails_Are_Sent/how_do_i_send_mail_through_subuser_accounts.md b/source/Classroom/Send/How_Emails_Are_Sent/how_do_i_send_mail_through_subuser_accounts.md deleted file mode 100644 index a2a24f1bb5..0000000000 --- a/source/Classroom/Send/How_Emails_Are_Sent/how_do_i_send_mail_through_subuser_accounts.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -seo: - title: How do I send mail through Subuser accounts? - description: How do I send mail through Subuser accounts? - keywords: segmentation, subuser, subaccount, account -title: How do I send mail through Subuser accounts? -weight: 0 -layout: page -zendesk_id: 200181908 -navigation: - show: true ---- - -All you need to do to send mail through a Subuser account is to simply **use that subuser account’s credentials to send mail via SMTP or API** rather than the parent account credentials. Subusers can also log into [sendgrid.com](http://sendgrid.com/) to take advantage of the [SendGrid Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/index.html) tool to send campaigns to stored lists via the online user interface. - diff --git a/source/Classroom/Send/How_Emails_Are_Sent/sending.md b/source/Classroom/Send/How_Emails_Are_Sent/sending.md index 7e617fb8db..874f0389f5 100644 --- a/source/Classroom/Send/How_Emails_Are_Sent/sending.md +++ b/source/Classroom/Send/How_Emails_Are_Sent/sending.md @@ -49,7 +49,7 @@ I accidentally scheduled a campaign I didn’t want to send. - -A: You can Unschedule the campaign from the action cog menu and it will return to a Draft form. Whew! +A: You can Unschedule the campaign from the action menu menu and it will return to a Draft form. Whew! - diff --git a/source/Classroom/Send/How_Emails_Are_Sent/smtp_overview.md b/source/Classroom/Send/How_Emails_Are_Sent/smtp_overview.md deleted file mode 100644 index da1806aa81..0000000000 --- a/source/Classroom/Send/How_Emails_Are_Sent/smtp_overview.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -seo: - title: SMTP Overview - description: Learn how to send email via SendGrid's SMTP service. - keywords: smtp, smtpapi, x-smtpapi, headers, filters, send, email -title: SMTP Overview -weight: 0 -layout: page -navigation: - show: true ---- - -{% anchor h2 %} -Table of Contents -{% endanchor %} - -* [What is SMTP?](#-What-is-SMTP) -* [How to Send Email via SMTP](#-How-to-Send-Email-via-SMTP) -* [Customizing Your Send](#-Customizing-Your-Send) -* [Filters](#-Filters) -* [Scheduling Your Send](#-Scheduling-Your-Send) -* [Substitution Tags](#-Substitution-Tags) -* [Section Tags](#-Section-Tags) -* [Suppression Groups](#-Suppression-Groups) -* [Categories](#-Categories) -* [Unique Arguments](#-Unique-Arguments) - -{% anchor h2 %} -What is SMTP? -{% endanchor %} - -[SMTP]({{root_url}}/Glossary/smtp.html), or _simple mail transfer protocol_, is a quick and easy way to send email from one server to another. SendGrid provides a 3rd party SMTP service that allows you to deliver your email via our server instead of your own client or server. - -For a deeper dive into what SMTP is, what the benefits of sending email via SMTP are, and how SendGrid can help, see the [SMTP Service Crash Course](https://sendgrid.com/blog/smtp-service-crash-course/) on our blog. - -{% anchor h2 %} -How to Send Email via SMTP -{% endanchor %} - -1. [Create an API Key](https://app.sendgrid.com/settings/api_keys) with at least "Mail" permissions. -2. Set the server host in your email client or application to `smtp.sendgrid.net`. - * This setting is sometimes referred to as the _external SMTP server_ or the _SMTP relay_. -3. Set your username to `apikey`. -4. Set your password to the API key generated in step 1. -5. Set the port to `587`. - * For unencrypted or [TLS connections]({{root_url}}/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.html), use port `25`, `2525`, or `587`. - * For [SSL connections]({{root_url}}/Classroom/Basics/Email_Infrastructure/ssl_vs_tls.html), use port `465`. - -{% anchor h3 %} -Rate Limits -{% endanchor %} - -* You may send up to **100 messages per SMTP connection**. -* You may open up to **10 concurrent connections from a single server**. - -{% anchor h3 %} -Related Articles -{% endanchor %} - -* [SMTP Ports]({{root_url}}/Classroom/Basics/Email_Infrastructure/smtp_ports.html) -* [Recommended SMTP Settings]({{root_url}}/Classroom/Basics/Email_Infrastructure/recommended_smtp_settings.html) -* [Integrate With SendGrid]({{root_url}}/Integrate/index.html) - -{% anchor h2 %} -Customizing Your Send -{% endanchor %} - -{% anchor h3 %} -Filters -{% endanchor %} - -You can customize the emails you send via SMTP by using different settings (also referred to as filters). These settings are specified within the **X-SMTPAPI header**. - -For example, to send a blind carbon copy (BCC) of your email to the address example@example.com, include the following in your X-SMTPAPI header: - -{% codeblock lang:json %} -{ - "filters" : { - "bcc" : { - "settings" : { - "enable" : 1, - "email" : "example@example.com" - } - } - } -} -{% endcodeblock %} - -For a complete list of settings that can be enabled via the X-SMTPAPI header, see our [SMTP documentation]({{root_url}}/API_Reference/SMTP_API/apps.html). - -{% anchor h3 %} -Scheduling Your Send -{% endanchor %} - -You can easily schedule when your email will be sent by using the `send_at` parameter within your X-SMTPAPI header. Set the value of `send_at` to a [UNIX timestamp](https://en.wikipedia.org/wiki/Unix_time) representing the time that you want your email to be sent. - -{% codeblock lang:json %} -{ - "send_at": 1409348513 -} -{% endcodeblock %} - -For more information, see our [scheduling parameters documentation]({{root_url}}/API_Reference/SMTP_API/scheduling_parameters.html). - -{% anchor h3 %} -Substitution Tags -{% endanchor %} - -Substitution tags allow you to dynamically insert specific content relevant to each of your recipients, such as their first and last names. - -For example, to use a substitution tag to replace the first name of your recipient, insert the tag `-name-` in the HTML of your message: - -{% codeblock lang:html %} - - - -

Hello -name-,
- The body of your email would go here... -

- - -{% endcodeblock %} - -To define the value that will replace the `-name-` tag, define the following in your X-SMTPAPI header: - -{% codeblock lang:json %} -{ - "to": [ - "john.doe@example.com", - "jane.doe@hotmail.com" - ], - "sub": { - "-name-": [ - "John", - "Jane" - ] - } -} -{% endcodeblock %} - -For more information, see our [substitution tags documentation]({{root_url}}/API_Reference/SMTP_API/substitution_tags.html). - -{% anchor h3 %} -Section Tags -{% endanchor %} - -Section tags are similar to substitution tags, but rather than replace tags with content for each individual recipient, section tags allow you to replace a tag with more generic content— like a salutation. - -For more information, see our [section tags documentation]({{root_url}}/API_Reference/SMTP_API/section_tags.html). - -{% anchor h3 %} -Suppression Groups -{% endanchor %} - -You can easily specify an unsubscribe group for an email sent via SMTP by including the `asm_group_id` parameter in your X-SMTPAPI header. Simply set the value of `asm_group_id` to the numerical ID of the group you would like to use. - -{% codeblock lang:json %} -{ - "asm_group_id": 1 -} -{% endcodeblock %} - -For more information, see our [suppression groups documentation]({{root_url}}/API_Reference/SMTP_API/suppressions.html). - -{% anchor h3 %} -Categories -{% endanchor %} - -Categories allow you to track your emails according to broad topics that you define, like "Weekly Newsletter" or "Confirmation Email". Simply define the category by using the `category` parameter within your X-SMTPAPI header: - -{% codeblock lang:json %} -{ - "category": "Example Category" -} -{% endcodeblock %} - -For more information, see our categories documentation. - -{% info %} -Categories should only be used for broad topics. To attach unique identifiers, please use [unique arguments]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html). -{% endinfo %} - -{% anchor h3 %} -Unique Arguments -{% endanchor %} - -Unique arguments are a very useful way for you to track your emails based on specific identifiers unique to individual messages. Unique arguments can be retrieved via SendGrid's [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html) or your [email activity page]({{root_url}}/User_Guide/email_activity.html). - -For more information, see our [unique arguments documentation]({{root_url}}/API_Reference/SMTP_API/unique_arguments.html). diff --git a/source/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_scheduled_send.md b/source/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_scheduled_send.md index 78d9e5631b..73bd2f5755 100644 --- a/source/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_scheduled_send.md +++ b/source/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_scheduled_send.md @@ -85,15 +85,19 @@ The batch ID generated in step 1 can now be used when scheduling an email via th {% endapiv3example %} +{% info %} +If you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid those times (for example, scheduling at 10:53) can result in lower deferral rates because it won't be going through our servers at the same times as everyone else's mail. +{% endinfo %} + {% anchor h4 %} 3. Cancel or Pause Your Send {% endanchor %} Now that your email has been scheduled and has a batch ID assigned, you can [pause or cancel the send]({{root_url}}/API_Reference/Web_API_v3/cancel_schedule_send.html#-Cancel-Scheduled-Sends) at any time up to 10 minutes before the scheduled send time. -{% info %} +{% warning %} Scheduled sends cancelled less than 10 minutes before the scheduled time are not guaranteed to be cancelled. -{% endinfo %} +{% endwarning %} To only pause your scheduled send, simply set the `status` parameter in your request to "pause". To completely cancel your request, set `status` to "cancel". @@ -123,7 +127,7 @@ Canceling a Marketing Campaign Using the User Interface {% endanchor %} -If you scheduled a specific time to send your campaign, it's easy to unschedule this campaign to make changes or reschedule it. Simply navigate to your [Campaigns page](https://sendgrid.com/marketing_campaigns/ui/campaigns) by clicking **Marketing Campaigns** in the left hand navigation menu and selecting **Campaigns**. Next to the campaign you want to unschedule, click the action cog and select **Unschedule**. +If you scheduled a specific time to send your campaign, it's easy to unschedule this campaign to make changes or reschedule it. Simply navigate to your [Campaigns page](https://sendgrid.com/marketing_campaigns/ui/campaigns) by clicking **Marketing Campaigns** in the left hand navigation menu and selecting **Campaigns**. Next to the campaign you want to unschedule, click the action menu and select **Unschedule**. ![]({{root_url}}/images/unschedule_campaign.gif) @@ -131,7 +135,7 @@ If you scheduled a specific time to send your campaign, it's easy to unschedule Using the API {% endanchor %} -You can unschedule a campaign by making a call to [/v3/camaigns/{campaign_id}/schedules]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.html#Unschedule-a-Scheduled-Campaign-DELETE) where `{campaign_id}` is the ID of the campaign you want to unschedule. A successful unschedule will return a 204. **You cannot unschedule campaigns that are already in the process of being sent. You should instead cancel or delete the campaign.** +You can unschedule a campaign by making a call to [/v3/campaigns/{campaign_id}/schedules]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.html#Unschedule-a-Scheduled-Campaign-DELETE) where `{campaign_id}` is the ID of the campaign you want to unschedule. A successful unschedule will return a 204. **You cannot unschedule campaigns that are already in the process of being sent. You should instead cancel or delete the campaign.** {% apiv3example delete DELETE https://api.sendgrid.com/v3/campaigns/{campaign_id}/schedules %} {% v3response %} diff --git a/source/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_send_in_progress.md b/source/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_send_in_progress.md index d4d5164643..96d9d62afb 100644 --- a/source/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_send_in_progress.md +++ b/source/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_send_in_progress.md @@ -27,7 +27,7 @@ Stopping an ongoing send that is using SMTP or the Web API can be tricky, becaus 1. Change Your Password {% endanchor %} -The simple act of [changing your password](https://app.sendgrid.com/settings/account) can break your existing email integration by causing a mismatch between what your app is trying to authenticate with and what we have on record. +The simple act of [changing your password](https://app.sendgrid.com/settings/account) can break your existing email integration by causing a mismatch between what your app is trying to authenticate with and what we have on record. This method is great if you have a runaway script or have just started a send accidentally. Be sure to verify that the credentials your app is using belong either to the parent account or a [teammate](https://app.sendgrid.com/settings/teammates) so you can change the proper one. diff --git a/source/Classroom/Send/When_Emails_Are_Sent/how_can_i_schedule_emails_to_send_at_specific_times.md b/source/Classroom/Send/When_Emails_Are_Sent/how_can_i_schedule_emails_to_send_at_specific_times.md index ba62d9c7c2..66f9a47b36 100644 --- a/source/Classroom/Send/When_Emails_Are_Sent/how_can_i_schedule_emails_to_send_at_specific_times.md +++ b/source/Classroom/Send/When_Emails_Are_Sent/how_can_i_schedule_emails_to_send_at_specific_times.md @@ -11,15 +11,22 @@ navigation: show: true --- -There are 2 easy ways to schedule your emails; One way is using [Marketing Campaigns](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/index.html), and the other is using our [SMTP API](https://sendgrid.com/docs/API_Reference/SMTP_API/scheduling_parameters.html) header. +There are 3 easy ways to schedule your emails; use [Marketing Campaigns](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/index.html), use the [SMTP API](https://sendgrid.com/docs/API_Reference/SMTP_API/scheduling_parameters.html) header, or use the API. + +{% info %} +If you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid those times (for example, scheduling at 10:53) can result in lower deferral rates because it won't be going through our servers at the same times as everyone else's mail. +{% endinfo %} #1. Marketing Campaigns If you are using Marketing Campaigns, you can schedule a time to send your campaign from the Settings tab by turning Off the option to Send Immediately. Next, verify that you are using the the correct time zone, and then simply choose the date and time that you would like to send your campaign at. -You can also schedule your campaigns with the [Marketing Campaigns API](https://sendgrid.com/docs/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.html#Schedule-a-Campaign-POST). +You can also schedule your campaigns with the [Marketing Campaigns API](https://sendgrid.com/docs/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.html#Schedule-a-Campaign-POST). + +#2. API +You can you can schedule a time to send your email by using the the `send_at` object of the `POST /mail/send` method of the [V3 API](https://sendgrid.com/docs/API_Reference/api_v3.html). For more information about scheduling and stopping scheduled sends with the API, see [Can I Stop a Scheduled Send]({{root_url}}/Classroom/Send/When_Emails_Are_Sent/can_i_stop_a_scheduled_send.html). -#2. SMTP API +#3. SMTP API You can use the [SMTP API](https://sendgrid.com/docs/API_Reference/SMTP_API/scheduling_parameters.html) header to schedule your emails when sending via [SMTP](https://sendgrid.com/docs/Integrate/index.html#-SMTP-Relay) or our [mail.send API endpoint](https://sendgrid.com/docs/API_Reference/Web_API/mail.html). SendGrid will allow you to queue batches of emails targeting individual recipients by using a UNIX time stamp parameter in your SMTP API header. This parameter allows SendGrid to begin processing your email requests before sending. SendGrid will then queue those messages and release them when the specified time rolls around. @@ -27,3 +34,4 @@ This parameter allows SendGrid to begin processing your email requests before se Here's an example of how this timestamp might look in your SMTP API JSON header. **{ "send\_at": 1409348513 }** + diff --git a/source/Classroom/Send/When_Emails_Are_Sent/seeing_a_delay_with_your_first_few_sends.md b/source/Classroom/Send/When_Emails_Are_Sent/seeing_a_delay_with_your_first_few_sends.md index eb4d0751ed..ba7744d389 100644 --- a/source/Classroom/Send/When_Emails_Are_Sent/seeing_a_delay_with_your_first_few_sends.md +++ b/source/Classroom/Send/When_Emails_Are_Sent/seeing_a_delay_with_your_first_few_sends.md @@ -11,7 +11,7 @@ navigation: show: true --- -SendGrid will occasionally slow sending for **new accounts** to evaluate and analyze traffic. This temporary delay is designed to ensure that as you scale with SendGrid, you can have confidence that you’ll be able to get the best possible deliverability. The length of this evaluation period can vary but you can always reach out to our support team to see about expediting the process. +SendGrid will occasionally slow sending for **new accounts** to evaluate and analyze traffic. This temporary delay is designed to ensure that as you scale with SendGrid, you can have confidence that you’ll be able to get the best possible deliverability. The length of this evaluation period can vary but you can always [contact support](https://support.sendgrid.com) to see about expediting the process. diff --git a/source/Classroom/Send/Who_You_Can_Send_To/can_i_send_to_purchased_lists.md b/source/Classroom/Send/Who_You_Can_Send_To/can_i_send_to_purchased_lists.md deleted file mode 100644 index 1f935fb87a..0000000000 --- a/source/Classroom/Send/Who_You_Can_Send_To/can_i_send_to_purchased_lists.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -seo: - title: Can I send to purchased lists? - description: Can I send to purchased lists? - keywords: policy, bought, affiliate, list, purchased, obtained, share, best practice -title: Can I send to purchased lists? -weight: 0 -layout: page -zendesk_id: 203803636 -navigation: - show: true ---- - -![]({{root_url}}/images/Lady-Gaga-No-Reaction-Gif.gif) - -Next question. - - - -In all seriousness, we don't allow our users to send to purchased lists for any reason. - -First, purchased lists violate our [Email Policy](https://sendgrid.com/email_policy). - -Second, it's just bad practice and sending to one will only end in tears. You can find out more [here]({{root_url}}/Classroom/Deliver/Address_Lists/why_purchased_email_lists_are_no_good.html). diff --git a/source/Classroom/Send/Who_You_Can_Send_To/resubscription_of_users.md b/source/Classroom/Send/Who_You_Can_Send_To/resubscription_of_users.md deleted file mode 100644 index abfb4942ba..0000000000 --- a/source/Classroom/Send/Who_You_Can_Send_To/resubscription_of_users.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -seo: - title: Resubscription of Users -title: Resubscription of Users -weight: 0 -layout: page -navigation: - show: true ---- - -{% anchor h2 %} -How Do I Resubscribe My Recipients? -{% endanchor %} - -If a recipient has opted out of your mailings in the past but wishes to re-open communications then you will need to remove their email address from the appropriate unsubscribe list. - -For recipients who have opted out of your transactional messages, all you need to do is locate the address in question on your global unsubscribe list, select the corresponding check box, and click the "delete" button. You can also check your [drops list](https://sendgrid.zendesk.com/hc/en-us/articles/203295137) for users to reconfirm. - -For marketing list resubscribes, you will need to locate the recipient list from which the recipient unsubscribed within your [suppressions settings]({{site.app_url}}/suppressions). Click on the "manage unsubscribes" link for the list in question, locate and select the recipient's email address, and then click the "resubscribe" button. - -{% anchor h3 %} -Removing Unsubscribes is Risky Business... -{% endanchor %} - -Be careful when removing recipients from your suppression lists in order to send to them again. In order to be [CAN-SPAM](http://www.business.ftc.gov/documents/bus61-can-spam-act-compliance-guide-business) compliant recipients must be able to opt out of any emails that they desire. Deleting unsubscribed addresses so that you can send to them again without the recipient's knowledge could result in you, the sender, being penalized for violating the CAN-SPAM Act. This is also in direct violation of SendGrid's email sending policies. - -{% anchor h3 %} -Would You Like to Know More? -{% endanchor %} - -Still a little unsure on the particulars? If so, please don't hesitate to contact our support team at your convenience and we will be happy to help! diff --git a/source/Classroom/Send/Who_You_Can_Send_To/segmenting_traffic.md b/source/Classroom/Send/Who_You_Can_Send_To/segmenting_traffic.md deleted file mode 100644 index f56842c664..0000000000 --- a/source/Classroom/Send/Who_You_Can_Send_To/segmenting_traffic.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: page -weight: 0 -title: Segmenting Your Traffic -seo: - title: Segmenting Your Traffic Overview - description: Segmenting your traffic protects your deliverability and keeps your stats seperate by type of email. -navigation: - show: true ---- - -If you are sending more than one type of email to your customers, such as marketing and transactional, it is -often a good idea to separate the IPs that you send these emails from in order to get better deliverability and -email engagement tracking. - -{% anchor h2 %} -Segmenting by IP Address -{% endanchor %} - -One way of segmenting your email sends is to use our IP Pooling feature to send your different email types through different IPs. These IPs can be Whitelabeled to your domain, so the receiving mail servers have no questions about who sent the emails. - -{% anchor h2 %} -Segmenting by Subuser and IP -{% endanchor %} - -You can also segment your email sending by subuser, which will allow you to share the same overall email credit pool but have unique SMTP credentials, settings, statistics, and site login. Subusers can also be Whitelabeled to separate sending domains by purchasing additional sending IPs and assigning a subuser to that IP. More information on segmentation via subusers can be found [here]({{root_url}}/Classroom/Deliver/Delivery_Introduction/segment_your_email_traffic_with_subusers.html). diff --git a/source/Classroom/Send/index.html b/source/Classroom/Send/index.html index fbf0b78c28..1c5ace2326 100644 --- a/source/Classroom/Send/index.html +++ b/source/Classroom/Send/index.html @@ -83,7 +83,6 @@

v3 Mail Send

diff --git a/source/Classroom/Send/v3_Mail_Send/curl_examples.md b/source/Classroom/Send/v3_Mail_Send/curl_examples.md index e333f2b9e9..f05fb97969 100644 --- a/source/Classroom/Send/v3_Mail_Send/curl_examples.md +++ b/source/Classroom/Send/v3_Mail_Send/curl_examples.md @@ -21,7 +21,7 @@ curl --request POST \ --url https://api.sendgrid.com/v3/mail/send \ --header 'Authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ - --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sender@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}' + --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Heya!"}]}' {% endcodeblock %} {% anchor h2 %} @@ -33,7 +33,7 @@ curl --request POST \ --url https://api.sendgrid.com/v3/mail/send \ --header 'authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ - --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}],"cc": [{"email":"recipient2@example.com"}, {"email": "recipient3@example.com"}, {"email":"recipient4@example.com"}]}], "from": {"email": "sender@example.com"},"subject":"Hello, World!", "content": [{"type": "text/plain", "value": "Heya!"}]}' + --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}],"cc": [{"email":"recipient2@example.com"}, {"email": "recipient3@example.com"}, {"email":"recipient4@example.com"}]}], "from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!", "content": [{"type": "text/plain", "value": "Heya!"}]}' {% endcodeblock %} {% anchor h2 %} @@ -45,7 +45,7 @@ curl --request POST \ --url https://api.sendgrid.com/v3/mail/send \ --header 'authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ - --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}],"cc": [{"email":"recipient2@example.com"}, {"email": "recipient3@example.com"}, {"email":"recipient4@example.com"}]}], "from": {"email": "sender@example.com"},"subject":"Hello, World!", "content": [{"type": "text/plain", "value": "Heya!"}]}' + --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}],"cc": [{"email":"recipient2@example.com"}, {"email": "recipient3@example.com"}, {"email":"recipient4@example.com"}]}], "from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!", "content": [{"type": "text/plain", "value": "Heya!"}]}' {% endcodeblock %} {% anchor h2 %} @@ -57,7 +57,7 @@ curl --request POST \ --url https://api.sendgrid.com/v3/mail/send \ --header 'authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ - --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sender@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "template_id" : "YOUR_TEMPLATE_ID"}' + --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "template_id" : "YOUR_TEMPLATE_ID"}' {% endcodeblock %} {% anchor h2 %} @@ -69,7 +69,7 @@ curl --request POST \ --url https://api.sendgrid.com/v3/mail/send \ --header 'authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ - --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sender@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "send_at" : "UNIX_TIMESTAMP_HERE"}' + --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "send_at" : "UNIX_TIMESTAMP_HERE"}' {% endcodeblock %} {% anchor h2 %} @@ -92,7 +92,7 @@ curl --request POST \ --url https://api.sendgrid.com/v3/mail/send \ --header 'authorization: Bearer YOUR_API_KEY' \ --header 'Content-Type: application/json' \ - --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sender@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "send_at" : "UNIX_TIMESTAMP_HERE", "batch_id" : "YOUR_BATCH_ID"}' + --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject":"Hello, World!","content": [{"type": "text/plain","value": "Heya!"}], "send_at" : "UNIX_TIMESTAMP_HERE", "batch_id" : "YOUR_BATCH_ID"}' {% endcodeblock %} **Step 3: Cancel the scheduled email** diff --git a/source/Classroom/Send/v3_Mail_Send/how_to_migrate_from_v2_to_v3_mail_send.md b/source/Classroom/Send/v3_Mail_Send/how_to_migrate_from_v2_to_v3_mail_send.md index 341572c055..fd02e0e58e 100644 --- a/source/Classroom/Send/v3_Mail_Send/how_to_migrate_from_v2_to_v3_mail_send.md +++ b/source/Classroom/Send/v3_Mail_Send/how_to_migrate_from_v2_to_v3_mail_send.md @@ -56,7 +56,7 @@ For example, if you wanted to schedule an email to be sent at a certain time usi {% codeblock %} api_user=YOUR_USER_NAME& api_key=YOUR_PASSWORD& -to=john.doe@example.com& +to=john.doeexampexample@example.com& toname=John& subject=Hello, World!& text=Hello, World!& @@ -70,7 +70,7 @@ However, the equivalent API call for the the v3 mail send endpoint would look li { "personalizations": [{ "to": [{ - "email": "john.doe@example.com" + "email": "john.doeexampexample@example.com" }], "subject": "Hello, World!", "send_at": 1459728000 diff --git a/source/Classroom/Send/v3_Mail_Send/personalizations.md b/source/Classroom/Send/v3_Mail_Send/personalizations.md index fc0080b6d0..c18d90a30d 100644 --- a/source/Classroom/Send/v3_Mail_Send/personalizations.md +++ b/source/Classroom/Send/v3_Mail_Send/personalizations.md @@ -28,7 +28,7 @@ Think of the personalizations section of the request body like the envelope of a You must include at least one "to" object within the personalizations array. {% endinfo %} -Since the `personalizations` parameter is an array, you may include multiple objects allowing you to specify different handling instructions for different copies of your email. For example, you could send the same email to both <john@example.com> and <jane@example.com>, but set each email to be delivered at different times. +Since the `personalizations` parameter is an array, you may include multiple objects allowing you to specify different handling instructions for different copies of your email. For example, you could send the same email to both <john@example.com> and <janeexampexample@example.com>, but set each email to be delivered at different times. {% info %} You may not include more than 1000 personalizations per API request. If you need to include more than 1000 personalizations, please divide these across multiple API requests. diff --git a/source/Classroom/Send/v3_Mail_Send/v3_mail_send_faq.md b/source/Classroom/Send/v3_Mail_Send/v3_mail_send_faq.md index 3360626f32..0cce4b3ead 100644 --- a/source/Classroom/Send/v3_Mail_Send/v3_mail_send_faq.md +++ b/source/Classroom/Send/v3_Mail_Send/v3_mail_send_faq.md @@ -52,7 +52,7 @@ What’s the difference between sending mail via SMTP and the Web API? Sending email via the [SMTP-Relay]({{root_url}}/Integrate/index.html#-SMTP-Relay) is a quick and simple way to integrate your existing SMTP code with SendGrid’s email functionality. All you have to do is modify your SMTP configuration to point to SendGrid’s SMTP server and your email will be routed through SendGrid’s SMTP-Relay. You may then specify special instructions for how you would like SendGrid to handle your email by means of the [X-SMTPAPI header]({{root_url}}/API_Reference/SMTP_API/index.html). -The Web API, on the other hand, requires you to make an HTTP request to an endpoint in SendGrid’s API. Previously, SendGrid has only offered a mail sending endpoint in the Web API v2, but now you can use the RESTful Web API v3 to send your email. Simply make an `HTTP POST` request to `https://api.sendgrid.com/v3/mail/send/beta` with the data for your email included in a JSON payload. For more information, please visit our [v3 Mail Send documentation]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html). +The Web API, on the other hand, requires you to make an HTTP request to an endpoint in SendGrid’s API. Previously, SendGrid has only offered a mail sending endpoint in the Web API v2, but now you can use the RESTful Web API v3 to send your email. Simply make an `HTTP POST` request to `https://api.sendgrid.com/v3/mail/send` with the data for your email included in a JSON payload. For more information, please visit our [v3 Mail Send documentation]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html). {% anchor h2 %} Can I send marketing email over the v3 Mail Send endpoint? @@ -64,7 +64,7 @@ You can send any type of email (transactional or marketing) over the v3 Mail Sen Are there limits on how often I can send email and how many recipients I can send to? {% endanchor %} -There are rate limits on how frequently you can call the v3 Mail Send endpoint. Currently, you may make up to 3,000 requests per second to our endpoint. Each email you send may include up to 1000 recipients. For more information on other limitations, and how this may impact your integration, please visit our [v3 Mail Send overview]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html). +There are rate limits on how frequently you can call the v3 Mail Send endpoint. Currently, you may make up to 10,000 requests per second to our endpoint. Each email you send may include up to 1000 recipients. For more information on other limitations, and how this may impact your integration, please visit our [v3 Mail Send overview]({{root_url}}/API_Reference/Web_API_v3/Mail/index.html). {% anchor h2 %} Why did you remove the x-smtpapi parameter? Can I still change my mail settings, tracking settings, and unique arguments? diff --git a/source/Classroom/Track/Bounces/bounce_forwarding_and_gmail.md b/source/Classroom/Track/Bounces/bounce_forwarding_and_gmail.md deleted file mode 100644 index a1284cc2c2..0000000000 --- a/source/Classroom/Track/Bounces/bounce_forwarding_and_gmail.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -seo: - title: Bounce Forwarding and Gmail - description: Bounce Forwarding and Gmail - keywords: spam, forwarding, forward, gmail, bounce, google, filter -title: Bounce Forwarding and Gmail -weight: 0 -layout: page -zendesk_id: 204336633 -navigation: - show: true ---- - -If you have [Bounce Forwarding](https://app.sendgrid.com/settings/mail_settings) enabled within your account, you may have experienced some or all of the bounce messages we send going to the spam folder of your Gmail account. - -![]({{root_url}}/images/bounce_forward.gif) - -Why is that? When Gmail receives one of our bounce forward messages, it has the tendency to get confused. Specifically, it doesn't see a corresponding message in the sent folder that relates to that bounce message. It may then decide that the bounce message isn't valid and send it to spam. - -You can get around this by following the instructions below to create a filter that teaches Gmail to behave differently when receiving bounce forward messages from Sendgrid. - - - -**Step 1** - -In Gmail, go to **Settings** > **Filters** > **Create a new filter** - -![]({{root_url}}/images/gmailsettings.gif) - - - -**Step 2** - -![]({{root_url}}/images/Step1.png) - - - -**Step 3** - -![]({{root_url}}/images/Step2.png) - - - -And that's it! You should now start to see bounce forward messages arrive in your Gmail inbox. - diff --git a/source/Classroom/Track/Bounces/bounce_reports_how_can_i_be_notified.md b/source/Classroom/Track/Bounces/bounce_reports_how_can_i_be_notified.md deleted file mode 100644 index f0bd6d4d15..0000000000 --- a/source/Classroom/Track/Bounces/bounce_reports_how_can_i_be_notified.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -seo: - title: Bounce Reports: How can I be notified? - description: Bounce Reports: How can I be notified? - keywords: -title: Bounce Reports: How can I be notified? -weight: 0 -layout: page -zendesk_id: 200185158 -navigation: - show: true ---- - -If you want to receive notification of [bounces](http://app.sendgrid.com/bounces) in your application, you can enable the [Real-time Event Notification API](http://sendgrid.com/docs/API_Reference/Webhooks/event.html) and SendGrid will alert your application of any bounces, clicks, opens, or otherwise that happen to the emails you send. Alternatively, you can enable [Bounce Forwarding](https://app.sendgrid.com/settings/mail_settings) within your account to receive an email each time a bounce occurs. - -You can also retrieve and edit your list of bounces through our [Web API.](http://sendgrid.com/docs/API_Reference/Web_API/bounces.html) diff --git a/source/Classroom/Track/Bounces/common_smtp_server_bounce_responses.md b/source/Classroom/Track/Bounces/common_smtp_server_bounce_responses.md deleted file mode 100644 index 0ab093e103..0000000000 --- a/source/Classroom/Track/Bounces/common_smtp_server_bounce_responses.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -seo: - title: Common SMTP Server Bounce Responses - description: Common SMTP Server Bounce Responses - keywords: policy, address, form, NDR, bounce, block, 250, 450, 451, 452, 550, 551, 552, 553, 554, delayed, Unable to Parse Server Reason, invalid, response, delay, queued, delivery, deferred -title: Common SMTP Server Bounce Responses -weight: 0 -layout: page -zendesk_id: 200181758 -navigation: - show: true ---- - -Email, at it's core, is essentially two or more computers talking to each other in short codes to relay simple text messages. Being able to interpret these codes when something goes wrong is a skill that doesn't always come naturally, so we've assembled a collection of common responses you're likely to see come back from recipient mail servers, as well as some guidance on what to do with them. - -This is only a small handful of example codes that can get sent back. Every receiving mail server out there is unique, so the responses you see may differ from those below. Always refer to the human-readable portion of the response code to get more info if you get stuck, or check out our new [Deliverability Center](https://sendgrid.com/deliverabilitycenter/#/) to see if an explanation of your response code has been listed! - -## **250** - -The best mail server response code you can get. When you see this, everything has gone according to plan! This response is what results in a 'Delivered' event within your Sendgrid stats, and indicates that the recipient server has accepted the message. - -### Examples: - -- 250 2.0.0 OK 1376056636 i3si9508927obz.16 - gsmtp -- 250 ok dirdel -- 250 <4798911130a2069f3483fda756b8e81c@www.example.com> Queued mail for delivery - -**_ What to do with this response_** _:_ Nothing, all is well with the cosmos. If you want, you could always print it out and frame it. Do keep in mind that messages that contain things like "Queued mail for delivery" is still indicative of a successful handoff to the recipient server, but there may still be internal queueing on the far end . -

- -#Temporary Failures - _“If at first you don’t succeed..."_ - -A 400-style message is usually returned when some sort of transient error is encountered during the message transaction. These types of responses are usually not a cause for alarm as most of these will iron themselves out given a little time. - -## **421** - -Messages are temporarily deferred because of recipient server policy reasons. Usually because of too many messages or connections in too short a timeframe. - -### Examples: - -- 421 4.7.0 [GL01] Message from (X.X.X.X) temporarily deferred -- 421 4.7.1 : (DYN:T1) http://postmaster.info.aol.com/errors/421dynt1.html (throttled) -- 421 4.7.0 [GL01] Message from (X.X.X.X) temporarily deferred - 4.16.50. Please refer to http://postmaster.yahoo.com/errors/postmaster-21.html - -**_What to do with this response_**: We’ll continue to retry deferred messages for up to 72 hours for a response like this, but you may consider temporarily easing off the throttle when sending messages to a domain that is returning this code, just so you don’t further delay your messages currently being tried. - -## **450** - -The message failed because the user's mailbox was unavailable, perhaps because it was locked or was not routable at the time. - -### Examples: - -- 450 4.2.1 The user you are trying to contact is receiving mail too quickly. Please resend your message at a later time. If the user is able to receive mail at that time, your message will be delivered. -- 450 too frequent connects from 198.37.147.135, please try again later. (throttled) - - **_What to do with this response_**: We’ll continue to retry deferred messages for up to 72 hours for a response like this. Generally this is based on a large influx of messages that you send, or if you've sent at a rate that the recipient server deems worthy of slowing down. - -## **451** - -The message simply failed, usually due to a far-end server error. This is unlikely anything you’ve done, remember we’ll keep retrying for 72 hours, so just keep an eye on it. - -### Examples: - -- 451 mta1012.mail.gq1.yahoo.com Resources temporarily unavailable. Please try again later [#4.16.1]. -- 451 Temporary local problem - please try later - -**_What to do with this response_** : We’ll continue to retry deferred messages for up to 72 hours for a response like this. Just keep your eyes peeled to see if the response to our retry attempts change. - -## **452** - -The message has been deferred due to insufficient system storage. Not your fault, they'll probably accept the mail later on once there's more space. - -### Examples: - -- 452 Too many recipients received this hour (throttled) -- 452. 4.3.1 Insufficient system storage (throttled) -- 452 4.2.2 Over Quota - -**_What to do with this response_** : We’ll continue to retry deferred messages for up to 72 hours for a response like this. Just keep your eyes peeled to see if the response to our retry attempts change. -

-#Hard Failures - _"Return to Sender..."_ - -A Hard, or Immediate, failure is anything that gets 500-style message as the result of trying to hand off a message. This typically indicates that some sort of permanent error occurred, this can range from systemic errors on the far-end server that just flat out prevents mail from coming in, all the way to policy-related blocks pertaining to content or other such factors. The examples below will give a taste of some of the myriad reasons a 500-style NDR(non-delivery response) can get returned for. - -## **550** - -The user's mailbox was unavailable. Usually because it could not be found, or because of incoming policy reasons. - -### Examples: - -- 550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. -- 550 Requested action not taken: mailbox unavailable -- 550 5.1.1 <address@aol.com>: Recipient address rejected: aol.com - -**_ What to do with this response_** : It's probably a good idea to take addresses that throw this response off of your main list, as it's likely a bogus address or one that was mistyped. - -## **551** - -The intended mailbox does not exist on this recipient server. This response will sometimes include a forward address to try if the server knows where the intended mailbox is. - -### Examples: - -- 551 not our customer -- 551 user does not exist - -**_ What to do with this response_** : Don’t bother re-sending, the recipient server does not recognize the recipient address as being one of it’s own. Keep any eye on the human readable portion of the response, as it may include a forwarding address. - -## **552** - -The intended mailbox has exceeded its storage limits. - -### Examples: - -- 552 5.2.2 This message is larger than the current system limit or the recipient's mailbox is full. Create a shorter message body or remove attachments and try sending it again. - -**_What to do with this response_**: It’s at your discretion if you want to try re-sending, but there's a pretty good chance that it's a defunct address. We don't resend messages with this error code, so refer to the human readable portion for more guidance. - -## **553** - -The message was refused because the mailbox name is either malformed or does not exist. - -### Examples: - - - 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1) - - 553 Invalid/inactive user. - -_**What to do with this response_: Don’t retry sending to this address, it’s fairly likely that it’s a bogus or mistyped address. - -## **554** - -The message failed. This response is a ‘default’ of sorts, but can be attributed to anything from planetary alignment, tides of the moon, or just plain bad luck. Generally a very vague NDR, but refer to the human-readable portion of the message for further instruction. - -### Examples: - - - 554 5.7.1 - ERROR: Mail refused - - 554 5.7.1 [P4] Message blocked due to spam content in the message. - -**_ What to do with this response_** _:_ Use the human readable portion of the message for further guidance, if you’re not sure what to do, just consider the address “bad” unless the recipient contacts you. - -## **Other** - -Sendgrid will also display a code when the recipient server has responded with a literally blank reason code. Rather than leave you to ponder what a blank field might mean, the below message is displayed instead, letting you know that the far end was not able to respond intelligently to our request. - -Delayed Bounce - Unable to Parse Server Reason - -**_What to do with this response_** _:_ Your best bet is to contact the mail administrator for the intended recipient's mail domain to see if they have any more info on what may have happened. diff --git a/source/Classroom/Track/Bounces/delete_from_bounce_list_option_in_email_activity.md b/source/Classroom/Track/Bounces/delete_from_bounce_list_option_in_email_activity.md deleted file mode 100644 index 9286955f6d..0000000000 --- a/source/Classroom/Track/Bounces/delete_from_bounce_list_option_in_email_activity.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -seo: - title: Option to "Delete From Bounce List" in Email Activity - description: Delete From bounce list option in Email Activity - keywords: drop, list, email, bounce, dropped, activity, deleted, reason, delete from bounce list, bounce list, bounced address -title: Option to "Delete From Bounce List" in Email Activity -weight: 0 -layout: page -zendesk_id: 204074633 -navigation: - show: true ---- - -![]({{root_url}}/images/deletefrombouncelist.png) - - - -You may have seen this option floating around in your interactions with [Email Activity](https://sendgrid.com/logs/index), but what does it do? I'm glad you asked. - -This option allows you to easily remove this particular address from the appropriate Email Reports list in your account. Sending to addresses that are already on an Email Reports list can cause [Drop events]({{root_url}}/Classroom/Track/Drops/drop_reason_bounced_address.html) in the future. In the case of our above example, the [Bounces List](https://sendgrid.com/bounces) is the list in question. - -![]({{root_url}}/images/emailreports.gif) - -Removing an address from the Bounces list will allow you to send future messages without us intervening on your behalf, you're essentially telling us that this address should be fine, but something went wrong and you'd like to try again. - - - -Please note that you will also see this option appear alongside other event types such as Unsubscribe and Spam Report, in these cases this option works in the very same way, but simply removes in from the respective Email Reports list. diff --git a/source/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding.md b/source/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding.md deleted file mode 100644 index 2d95da3ff1..0000000000 --- a/source/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -seo: - title: How to set up bounce forwarding - description: How to set up bounce forwarding - keywords: -title: How to set up bounce forwarding -weight: 0 -layout: page -zendesk_id: 206261357 -navigation: - show: true ---- - -You can receive bounce notifications to a specific address by enabling the "Forward Bounces" feature in your account and defining the forwarding address. - - To access this feature navigate to Mail Settings --> Forward Bounce: - -[Mail Settings](https://sendgrid.com/beta/settings/mail_settings) - - - -You'll want to scroll down the page and click the "Enable Bounces Forwarding" box, and leave the email address entry field blank. This setup allows you to receive a bounce notification report to the FROM address on the email that bounced. - -![]({{root_url}}/images/bouncefwd.png) - - - - diff --git a/source/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding_to_go_to_the_emails_from_address.md b/source/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding_to_go_to_the_emails_from_address.md deleted file mode 100644 index bf3a3a095f..0000000000 --- a/source/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding_to_go_to_the_emails_from_address.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -seo: - title: How to set up bounce forwarding to go to the email's FROM address - description: How to set up bounce forwarding to go to the email's FROM address - keywords: bounces, reports, forwarding, forward, settings, email, bounce -title: How to set up bounce forwarding to go to the email's FROM address -weight: 0 -layout: page -zendesk_id: 200181478 -navigation: - show: true ---- - -You can receive bounce notifications to a specific address by enabling the "Forward Bounces" feature in your account and defining the forwarding address. However, you can also set it to send any bounces back to the originating FROM address. - -To access this feature navigate to **[Mail Settings](https://app.sendgrid.com/settings/mail_settings)** --> **Forward Bounce** - - -From there, toggle the slider to "on", then leave the "Use the from address" box ticked and the email address entry field blank. This setup allows you to receive a bounce notification report to the FROM address on the email that bounced. - - - diff --git a/source/Classroom/Track/Bounces/implementing_bounce_notification_for_multiple_from_addresses.md b/source/Classroom/Track/Bounces/implementing_bounce_notification_for_multiple_from_addresses.md deleted file mode 100644 index 29ed97c66f..0000000000 --- a/source/Classroom/Track/Bounces/implementing_bounce_notification_for_multiple_from_addresses.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -seo: - title: Implementing Bounce Notification For Multiple From Addresses - description: Implementing Bounce Notification For Multiple From Addresses - keywords: -title: Implementing Bounce Notification For Multiple From Addresses -weight: 0 -layout: page -zendesk_id: 200185178 -navigation: - show: true ---- - -Hi all, - -We send emails from multiple FROM addresses, and it is important that email bounces get sent back to the person sending the message. After a bit of digging around in the SendGrid SMTP API & Event Notification API we managed to implement a solution. Here's how: - -1. When sending your emails, you need to add an X-SMTPAPI header to each message which includes the **_from_** address of the sender. I also recommend including the subject as this is useful for when you send the bounce response back to the sender. - -The format of the X-SMTPAPI header is important. The value of the header must be in JSON format & look like this: { "unique\_args" : { "from" : "from\_email\_address", "subject" : "subject\_line" }}. The "from" & "subject" parameters can be different, that's just what we did - but the important bit is the _unique\_args_ wrapper. - -There is documentation & sample code on how to add the header here: [http://sendgrid.com/docs/API\_Reference/SMTP\_API/index.html](http://wiki.sendgrid.com/doku.php?id=smtp_api) -2. You need to create a publicly accessible page on your site that accepts a HTTP POST from the SendGrid Event Notification API (http://sendgrid.com/docs/API\_Reference/Webhooks/event.html). There is sample code on the wiki. The important thing to note here is that SendGrid will also POST the custom header values you specified in the X-SMTPAPI header above ("from" & "subject" in our case). These are the key to sending your bounce response. - -Within your custom page, you can read the form values for **email** (the failed address), **from** (your custom header with the sender address), **reason** (the reason for the failure), and if you've added it, **subject**. With all this you can build an email message and send it back to the sender. You may also want to check the **event** form value to only process events of type **_bounce_**. -3. The final step is to hook up your notification POST page to the SendGrid API, just log into your account and go to **Developers** > **Event Notification**. - -Cheers, -Anthony. - diff --git a/source/Classroom/Track/Clicks/click_tracking_html_best_practices.md b/source/Classroom/Track/Clicks/click_tracking_html_best_practices.md index c109459a5f..a8280f4469 100644 --- a/source/Classroom/Track/Clicks/click_tracking_html_best_practices.md +++ b/source/Classroom/Track/Clicks/click_tracking_html_best_practices.md @@ -24,8 +24,6 @@ The following links, even though they may still resolve, will not be captured or `SendGrid` -`SendGrid` - `SendGrid` diff --git a/source/Classroom/Track/Clicks/click_tracking_links_have_stopped_working.md b/source/Classroom/Track/Clicks/click_tracking_links_have_stopped_working.md index 8eb46b98c9..21422b03d6 100644 --- a/source/Classroom/Track/Clicks/click_tracking_links_have_stopped_working.md +++ b/source/Classroom/Track/Clicks/click_tracking_links_have_stopped_working.md @@ -22,26 +22,24 @@ If you are experiencing an issue where you or your recipients are seeing SendGri Be sure to go back and check your original email to ensure the URL you are passing (that is, before it gets to us) is indeed a valid link. Our click tracking mechanism does not validate URLs beyond looking for a http(s) protocol, a www., and an , " +"List-Unsubscribe": ", " } {% endcodeblock %} @@ -103,7 +103,7 @@ Using List-Unsubscribe with v3 Mail Send } ], "headers": { - "List-Unsubscribe": ", " + "List-Unsubscribe": ", " } } {% endcodeblock %} @@ -120,7 +120,7 @@ toname=Destination& subject=Example_Subject& text=testingtextbody& from=info@domain.com& -"headers": {"List-Unsubscribe": ", "} +"headers": {"List-Unsubscribe": ", "} {% endcodeblock %} {% anchor h3 %} @@ -129,6 +129,6 @@ List-Unsubscribe with SMTP {% codeblock lang:json %} { - "List-Unsubscribe": ", " + "List-Unsubscribe": ", " } {% endcodeblock %} diff --git a/source/Classroom/Track/Unsubscribes/unsubscribe_via_subscription_tracking.md b/source/Classroom/Track/Unsubscribes/unsubscribe_via_subscription_tracking.md index dbda4d462a..0ac3a6bf03 100644 --- a/source/Classroom/Track/Unsubscribes/unsubscribe_via_subscription_tracking.md +++ b/source/Classroom/Track/Unsubscribes/unsubscribe_via_subscription_tracking.md @@ -56,7 +56,7 @@ Change the Plain Text content as well. There won’t be any clickable wording he ## I don't want my unsubscribe links at the bottom! -This requires adding a HTML code snippet to the body of your email using the Replacement Tag field within the Subscription app’s settings. Set a replacement tag within the replacement tag field. {i.e. [unsubscribe]} +This requires adding a HTML code snippet to the body of your email using the Replacement Tag field within the Subscription app’s settings. Set a replacement tag within the replacement tag field. {i.e. [unsubscribe]} ![]({{root_url}}/images/Screen_Shot_2015-05-26_at_11.39.15_AM.png) diff --git a/source/Classroom/Troubleshooting/Account_Administration/account_under_review_suspended.md b/source/Classroom/Troubleshooting/Account_Administration/account_under_review_suspended.md index 56ad57784c..7bdc953569 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/account_under_review_suspended.md +++ b/source/Classroom/Troubleshooting/Account_Administration/account_under_review_suspended.md @@ -1,35 +1,67 @@ --- seo: - title: My Account Has Been Suspended / Banned + title: Suspended, Warned, Deactivated, or Banned description: Was your account suspended or is otherwise under review? Learn more here... - keywords: suspend, suspended, account, deactivated, banned, ban, deactivate, warn, warning, access, compromise, reactivate, stopped, stop, reactivated, turn, frozen, under, review -title: My Account Has Been Suspended / Banned + keywords: suspend, suspended, account, deactivated, banned, ban, deactivate, warn, warning, access, compromise, reactivate, stopped, stop, reactivated, turn, frozen, under, review, deactivated, compliance +title: Suspended, Warned, Deactivated, or Banned weight: 0 layout: page navigation: show: true --- -SendGrid reviews accounts that appear to have abnormal activity in order to preserve your reputation as a sender, as well as to to prevent potential bad actors on our system from influencing the rest of our sender population. The possible states of account review are explained below: +- [Warned](#-Warned) +- [Suspended](#-Suspended) +- [Deactivated](#-Deactivated) +- [Banned](#-Banned) +- [Reactivation](#-Reactivation) + +To preserve your reputation as a sender, SendGrid reviews accounts with apparent abnormal activity. Have you received a warning, suspension, deactivation, or ban notice from SendGrid? Please respond to any questions asked in the email notice. The fastest way to get your account reactivated is to respond directly to the ticket sent to your email address. In most cases, SendGrid Support cannot reactivate a warned, suspended, deactivated or banned account, so contacting them directly may delay reactivation. + +{% anchor h2 %} +Stages of review +{% endanchor %} + +Once your account is under review, SendGrid sends a notification to the address associated with your account indicating that it is one of the following states: + +{% anchor h3 %} +Warned +{% endanchor %} + +The account maintains full sending functionality during a warning period. However, if we do not receive a response, your account may be suspended to prevent further risk to your sending reputation. Accounts with a warned status can still upgrade their usage plan, or create new sub-users until the review has concluded to our satisfaction. + +{% anchor h3 %} +Suspended +{% endanchor %} + +SendGrid accepts and queues mail while the account is under review. The account holds mail until issues are resolved or up to 72 hours from the time of send. Any message queued for over 72 hours from sending expires and is not delivered. Delivered mail sent before the suspension is still functional, including open and click tracking, as well as link redirects. {% info %} -**Received a suspension, warning, deactivation, or ban notice from SendGrid?** We apologize for any interruption in your service. _Please respond to any questions asked in the email notice._ The fastest way to get your account reactivated is to respond directly to the ticket sent to your email address. In most cases, SendGrid Support cannot reactivate a suspended or banned account, so contacting them directly may delay reactivation. +An account in a suspended state continues to incur auto-renewal billing for your monthly subscription and any Marketing Campaigns contact storage. {% endinfo %} - -{% anchor h2 %}Suspended{% endanchor %} -SendGrid will accept and queue mail while the account is under review. Mail will be held until issues are resolved or up to 72 hours from the time of send. Any message queued for over 72 hours from send will expire and will not be delivered. _Please be aware that an account in a suspended state will continue to incur auto-renewal billing for your monthly subscription and any Marketing Campaigns contact storage._ -{% anchor h2 %}Warned{% endanchor %} -The account maintains full functionality during a warning period. However, if we do not receive a response your account may be suspended to prevent further risk to your sending reputation. Warned accounts will be unable to upgrade until the review has concluded to our satisfaction. +{% anchor h3 %} +Deactivated +{% endanchor %} -{% anchor h2 %}Deactivated{% endanchor %} -SendGrid will not accept mail while an account is deactivated. Upon deactivation, any undelivered mail that has been queued on SendGrid’s systems will be deleted. While the account is deactivated, click and open tracking links will be disabled. _Please be aware that an account in a deactivated state will continue to incur auto-renewal billing for your monthly subscription and any contacts storage._ Deactivated sub-users will not be accessible via the 'log in as' method available to parent accounts. However, deactivated sub-users will still be able to log in directly. +A deactivated SendGrid account cannot accept mail. Upon deactivation, SendGrid deletes any undelivered mail queued on the system. Click and Open tracking links are disabled in the deactivated account. Deactivated sub-users are not accessible via the ‘log in as’ method available to parent accounts. However, deactivated sub-users can still log in directly. -{% anchor h2 %}Banned{% endanchor %} -All access to the account is blocked, both through SendGrid.com as well as the API. Email requests to our system will not be accepted. If an account has dedicated IP's assigned to it, they will be removed. Related sub-users will also be banned and unable to send email or access their account. _Please be aware that an account in a banned state will stop any auto-renewal billing, though you will still be charged for any overages or Marketing Campaigns contact storage during the current month._ - -{% anchor h2 %}Reactivation{% endanchor %} -When all potential issues are resolved to our satisfaction, SendGrid will reactivate your service. Once reactivated, your account will be restored and any queued messages will be delivered. +{% info %} +An account in a deactivated state continues to incur auto-renewal billing for your monthly subscription and any contacts storage. +{% endinfo %} + +{% anchor h3 %} +Banned +{% endanchor %} +Banned accounts cannot access our system either through SendGrid.com or the API. Our system does not accept email requests from banned accounts. Dedicated IPs assigned to the account are removed. Related sub-users are unable to send email or access their account. + +{% info %} +An account in a banned state will stop any auto-renewal billing, though you will still be charged for any overages or Marketing Campaigns contact storage during the current month. +{% endinfo %} +{% anchor h3 %} +Reactivation +{% endanchor %} +Once you resolve all potential issues to our satisfaction, SendGrid will reactivate your service. Once activated, any queued messages will begin to process for delivery. diff --git a/source/Classroom/Troubleshooting/Account_Administration/cant_access_the_email_address_on_file_for_your_sendgrid_account.md b/source/Classroom/Troubleshooting/Account_Administration/cant_access_the_email_address_on_file_for_your_sendgrid_account.md index b5bcef1e1a..990baece3a 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/cant_access_the_email_address_on_file_for_your_sendgrid_account.md +++ b/source/Classroom/Troubleshooting/Account_Administration/cant_access_the_email_address_on_file_for_your_sendgrid_account.md @@ -14,7 +14,7 @@ navigation: show: true --- -Sometimes, people leave your company, and their email address may be deleted or lost. Those email accounts can sometimes be associated with important business accounts, like your account with SendGrid! This kind of access is important for notifications, billing alerts, and passwords reset emails. +Sometimes, people leave your company, and their email address may be deleted or lost. Those email accounts can sometimes be associated with important business accounts, like your account with SendGrid! This kind of access is important for notifications, billing alerts, and passwords reset emails. If you find yourself in a similar situation, use one of the following options to get back in the action: diff --git a/source/Classroom/Troubleshooting/Account_Administration/cant_log_in_to_your_account.md b/source/Classroom/Troubleshooting/Account_Administration/cant_log_in_to_your_account.md index 824a57ec82..1b5efc4ccf 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/cant_log_in_to_your_account.md +++ b/source/Classroom/Troubleshooting/Account_Administration/cant_log_in_to_your_account.md @@ -55,4 +55,4 @@ We will send out several warning emails in the course of a month if an account f When an account is banned, it is permanently cancelled. Access to the account is blocked and no further requests to our system will be accepted. A banned account is not allowed back on SendGrid in the future. If the account had dedicated IPs they will be removed. Related sub-users will also be banned. -We don't make a habit of letting banned accounts back on, but if you would like to discuss it, _please respond to the email you received regarding the ban._ **Support cannot assist in reactivation of banned accounts.** \ No newline at end of file +We don't make a habit of letting banned accounts back on, but if you would like to discuss it, _please respond to the email you received regarding the ban._ **Support cannot assist in reactivation of banned accounts.** diff --git a/source/Classroom/Troubleshooting/Account_Administration/help_i_cant_find_my_smtp_username_and_password.md b/source/Classroom/Troubleshooting/Account_Administration/help_i_cant_find_my_smtp_username_and_password.md index 77bd845ec3..9f1aaa4932 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/help_i_cant_find_my_smtp_username_and_password.md +++ b/source/Classroom/Troubleshooting/Account_Administration/help_i_cant_find_my_smtp_username_and_password.md @@ -19,4 +19,4 @@ Click [here]({{root_url}}/Classroom/Troubleshooting/Account_Administration/recov Click [here]({{root_url}}/Classroom/Basics/Account/how_do_i_reset_my_password.html) to learn how to reset your password. -If you are integrating with SendGrid's Web API v3, we highly recommend that you only use [API Keys]({{root_url}}/Classroom/Basics/API/api_key_permissions.html), not Basic Auth, when [authenticating]({{root_url}}/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/authentication.html). +If you are integrating with SendGrid's Web API v3, we highly recommend that you only use [API Keys]({{root_url}}/Classroom/Basics/API/api_key_permissions.html) when [authenticating]({{root_url}}/API_Reference/Web_API_v3/How_To_Use_The_Web_API_v3/authentication.html). diff --git a/source/Classroom/Troubleshooting/Account_Administration/help_my_account_has_been_compromised.md b/source/Classroom/Troubleshooting/Account_Administration/help_my_account_has_been_compromised.md index 693d626e86..8a2a606b63 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/help_my_account_has_been_compromised.md +++ b/source/Classroom/Troubleshooting/Account_Administration/help_my_account_has_been_compromised.md @@ -13,9 +13,7 @@ navigation: If you believe your account has been compromised, please login to your account and **_change your account username and password immediately_** under the [SendGrid Account Settings](https://apps.sendgrid.com/settings/account) page. You will also need to update the username and password in your sending application or code in order to get mail flowing again. -After changing your account username and password, please contact either the SendGrid Support team via chat, email, or phone or the SendGrid Compliance team via email so we can investigate the issue. - -_For sake of timely resolution, we recommend using CHAT _ which is available 24/7, 7 days a week_. We can help you investigate, and get our Compliance team involved if necessary. +After changing your account username and password, please [contact support](https://support.sendgrid.com). We can help you investigate, and get our Compliance team involved if necessary. We'll try and help you isolate any issues or vulnerabilities with your SendGrid integration. We can also temporarily deactivate your account as well as delete any messages that are currently in a pending state within our system. In some cases your account may have already been preemptively Suspended to prevent damage to your reputation, in these cases please check your email for a notification from our Compliance department and respond directly to it to get the ball rolling. diff --git a/source/Classroom/Troubleshooting/Account_Administration/heroku_users_find_your_sendgrid_credentials.md b/source/Classroom/Troubleshooting/Account_Administration/heroku_users_find_your_sendgrid_credentials.md index 29ef78f1e1..acf44ac1f0 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/heroku_users_find_your_sendgrid_credentials.md +++ b/source/Classroom/Troubleshooting/Account_Administration/heroku_users_find_your_sendgrid_credentials.md @@ -4,7 +4,7 @@ st: type: Classroom seo: title: Heroku Users - Find your SendGrid Credentials - description: Learn how to find and recover your username/password as a Sendgrid add-on user... + description: Learn how to find and recover your username/password as a SendGrid add-on user... keywords: heroku, password, reset, recover, username title: Heroku Users - Find your SendGrid Credentials weight: 0 @@ -14,15 +14,40 @@ navigation: show: true --- -#Find your existing username/password through the Heroku portal : -If you are a Heroku user using [the SendGrid add-on](https://addons.heroku.com/sendgrid), and would like to access the SendGrid web interface, or would just like to know your Sendgrid account credentials; you can find them by doing the following from the Heroku interface: +{% anchor h2 %} +Finding your existing username and password in the Heroku portal +{% endanchor %} ->1. Go to your Apps, choose Sendgrid ->2. Click on "settings" and then click “reveal config vars” +If you are a Heroku user using [the SendGrid add-on](https://addons.heroku.com/sendgrid), and would like to access the SendGrid web interface, or would just like to know your SendGrid account credentials; you can find them by doing the following from the Heroku interface: +1. In Heroku, go to your Apps, choose your SendGrid app -#Reset your SendGrid add-on password: + ![]({{root_url}}/images/HerokuPW1.png "Heroku SendGrid App Screenshot") -Go to the [Password Reset page](https://sendgrid.com/user/forgotPassword) and enter your SendGrid username, and click submit. An email will be sent to the email address on file with instructions on how to reset your password. If you don't know your SendGrid username, use the steps detailed above to find your username through the Heroku portal. Keep in mind that resetting your Sendgrid password may break any integrations you have that are currently using the exisiting credentials for authentication. +1. Click on "Settings" and then click “Reveal Config Vars” -Alternatively, you can contact [Heroku Support](https://www.heroku.com/support) directly to request a password reset for the SendGrid add-on. + ![]({{root_url}}/images/HerokuPW2.png "Heroku Config Vars Screenshot") + +{% info %} +Editing your username or password here will not have an effect on your SendGrid account credentials. +{% endinfo %} + +{% anchor h2 %} +Resetting your SendGrid add-on password +{% endanchor %} + +Go to the [SendGrid Password Reset page](https://sendgrid.com/user/forgotPassword) and enter your SendGrid username, and click submit. An email will be sent to the email address on file with instructions on how to reset your password. If you don't know your SendGrid username, use the steps detailed above to find your username through the Heroku portal. + +{% info %} +Resetting your password will not update the Config Vars of your SendGrid add-on in the Heroku portal. To update this please follow the directions above to pull up your add-on Settings/Config Vars. Then click the “edit” button to manually input your new password: +{% endinfo %} + +![]({{root_url}}/images/HerokuPW3.png "Heroku Config Vars Edit Screenshot") + +![]({{root_url}}/images/HerokuPW4.png) + +{% warning %} +Resetting your SendGrid password may break any integrations you have that are currently using the existing credentials for authentication. +{% endwarning %} + +Alternatively, you can contact [Heroku Support](https://www.heroku.com/support) directly to request a password reset for the SendGrid add-on. diff --git a/source/Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_azure.md b/source/Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_azure.md index d348f65e02..f355c82bd8 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_azure.md +++ b/source/Classroom/Troubleshooting/Account_Administration/how_to_change_the_password_for_your_sendgrid_add_on_via_azure.md @@ -11,17 +11,19 @@ navigation: show: true --- -_Please note that in order to maintain seamless email flow, it is important to also update any custom code, web pages or servers that use this account with your new passwords. If you are uncertain about these additional steps, consult the email administrator who created the account._ -**Step 1** - Log into your Azure subscription at portal.azure.com and find your SendGrid deployment: +Please note that in order to maintain seamless email flow, it is important to also update any custom code, web pages or servers that use this account with your new passwords. If you are uncertain about these additional steps, consult the email administrator who created the account. -![]({{root_url}}/images/azureloginpageupdated.png) +You should also make sure you are logged out of SendGrid.com before making any changes to your password via the Azure portal. -**Step 2** - Select ‘Reset Password’, enter and re-confirm your new password. Remember to save your new password in order for it to take effect. Your new password must be a minimum of 8 alpha-numeric characters. +1. Log into your Azure subscription at portal.azure.com and find your SendGrid deployment: -![]({{root_url}}/images/azurepwdchangeupdated.png) + ![]({{root_url}}/images/AzurePW1.png) - +1. Select **Change Password**, then enter and re-confirm your new password. Remember to save your new password in order for it to take effect. Your new password must be a minimum of 8 alpha-numeric characters. - + ![]({{root_url}}/images/AzurePW2.png) +1. If you do not know your current password then click “Reset Password” instead. + + ![]({{root_url}}/images/AzurePW3.png) diff --git a/source/Classroom/Troubleshooting/Account_Administration/i_didnt_receive_the_password_reset_email.md b/source/Classroom/Troubleshooting/Account_Administration/i_didnt_receive_the_password_reset_email.md index eb8514f4d0..4bca85a446 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/i_didnt_receive_the_password_reset_email.md +++ b/source/Classroom/Troubleshooting/Account_Administration/i_didnt_receive_the_password_reset_email.md @@ -20,10 +20,10 @@ There are a few things to take into account when requesting a password reset: * Ensure that you are expecting the email at the correct address. The password reset will be sent to email you have in your SendGrid account settings for the username you enter. -* It is also possible that you cannot login because our billing team has terminated your account due to non-payment. In this case you would have received several emails detailing the reason behind the terminatio. These emails are also going to the email you have in your SendGrid account settings. +* It is also possible that you cannot login because our billing team has terminated your account due to non-payment. In this case you would have received several emails detailing the reason behind the termination. These emails are also going to the email you have in your SendGrid account settings. * The reset email may be in your SPAM or Junk folder. If you do find it there, be sure to mark it as "not spam". -**For security reasons, Sendgrid support agents cannot change account passwords.** +**For security reasons, SendGrid support agents cannot change account passwords.** diff --git a/source/Classroom/Troubleshooting/Account_Administration/ip_access_management_has_locked_me_out_of_my_account.md b/source/Classroom/Troubleshooting/Account_Administration/ip_access_management_has_locked_me_out_of_my_account.md index 2c77efa49b..9be2e67928 100644 --- a/source/Classroom/Troubleshooting/Account_Administration/ip_access_management_has_locked_me_out_of_my_account.md +++ b/source/Classroom/Troubleshooting/Account_Administration/ip_access_management_has_locked_me_out_of_my_account.md @@ -1,7 +1,7 @@ --- seo: title: IP Access Management has locked me out of my account - description: Locked out of your account becasue of IPAM? Learn how to get back in here... + description: Locked out of your account because of IPAM? Learn how to get back in here... keywords: IP, access, management, locked, out, lockout, blocked, ipam, reactivate, login, can't title: IP Access Management has locked me out of my account weight: 0 @@ -13,13 +13,13 @@ navigation: ![]({{root_url}}/images/IPAM_login_warning.png) -It's possible under some circumstances to accidentally lock yourself out of your Sendgrid account when using IP Access Management. This article aims to help you get access again, as well as provide tips for avoiding lock-out in the future. +It's possible under some circumstances to accidentally lock yourself out of your SendGrid account when using IP Access Management. This article aims to help you get access again, as well as provide tips for avoiding lock-out in the future. 1. **First, try accessing the account from the IP(s) you have previously whitelisted.** This may require you to travel to and log in from a different physical location, or enlist the help of a colleague who can connect to one of those networks. 2. If you have tried the above suggestion, and access is not possible, please [submit a Support ticket](https://support.sendgrid.com/hc/en-us/requests/new#ipam-lockout) to inform us of your access issue. Please try to resolve access yourself before contacting support, as our agents will require that you attempt access from other IPs first before the process can move forward. -3. Once you have submitted a ticket, one of our agents will work with you to verify ownership of the account in a number of ways. We reserve the right to be very thorough with this process, as we treat the account security of our customers with very high sensitivity. +3. Once you have submitted a ticket, one of our agents will work with you to verify ownership of the account in a number of ways. We reserve the right to be very thorough with this process, as we treat the account security of our customers with very high sensitivity. 4. Once we can fully verify the ownership of your account to our satisfaction, we can provide access to your IP. After you are able to log back into your account, you can modify your IP access as needed or even disable the feature entirely. @@ -29,8 +29,8 @@ It's possible under some circumstances to accidentally lock yourself out of your Tips for not getting locked out: {% endanchor %} -**Add yourself first:** When initially setting up IP Access for your Sendgrid account, it's a good idea to always add your current public address first, so you don't lock yourself out accidentally right away. You can always find the public IP address of your current network by doing a [Google search for "what is my IP"](https://www.google.com/search?q=what+is+my+IP). +**Add yourself first:** When initially setting up IP Access for your SendGrid account, it's a good idea to always add your current public address first, so you don't lock yourself out accidentally right away. You can always find the public IP address of your current network by doing a [Google search for "what is my IP"](https://www.google.com/search?q=what+is+my+IP). -**Use caution with Residential Networks:** Keep in mind that if you are connecting from a home or residential network, it is not uncommon for ISPs to change the public IP addresses of their customers as they see fit and also without warning. This may result in a scenario where you suddenly cannot access your Sengrid account from your house, so use caution when whitelisting IPs from residential networks. +**Use caution with Residential Networks:** Keep in mind that if you are connecting from a home or residential network, it is not uncommon for ISPs to change the public IP addresses of their customers as they see fit and also without warning. This may result in a scenario where you suddenly cannot access your SendGrid account from your house, so use caution when whitelisting IPs from residential networks. **VPNs/VMs:** If you use a VPN to connect to your corporate network from home, or wish to connect from a virtual machine, ask your IT department for the correct IP that you should add to IP Access Management. diff --git a/source/Classroom/Troubleshooting/Account_Administration/recovering_your_username.md b/source/Classroom/Troubleshooting/Account_Administration/recovering_your_username.md deleted file mode 100644 index 9f7716b557..0000000000 --- a/source/Classroom/Troubleshooting/Account_Administration/recovering_your_username.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -seo: - title: Recovering your username - description: Don't know your username? Here are some actions you can try to recover your username... - keywords: log, don't, username, user,recover, reset, in, name, api_user, ID, forgot, know, my -title: Recovering your username -weight: 0 -layout: page - -navigation: - show: true ---- - -Your SendGrid username can be any string of characters that works for you! If you want, you may even use your email address as your username. - -Start by checking your existing code or SMTP integration to see if your username is plainly listed. - -If you still can't find your username, [complete this form](https://support.sendgrid.com/hc/en-us/requests/new#forgot-username) to begin the recovery process, and we can help you track it down! - -SendGrid also allows account owners to invite [teammates]({{root_url}}/User_Guide/Settings/teammates.html) to their account who have their own login credentials. - -If you are a teammate on a SendGrid account and have forgotten your password, please contact your account administrator or use the above form to get started. diff --git a/source/Classroom/Troubleshooting/Account_Administration/teammates.md b/source/Classroom/Troubleshooting/Account_Administration/teammates.md deleted file mode 100644 index 6a460cee30..0000000000 --- a/source/Classroom/Troubleshooting/Account_Administration/teammates.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -seo: - title: Teammates Troubleshooting Guide - description: Quick explanations and solutions for common Teammates issues. - keywords: Teammates, issue, fix, troubleshooting, troubleshoot, help -title: Teammates Troubleshooting Guide -weight: 0 -layout: page -navigation: - show: true ---- - -{% anchor h2 %} -Table of Contents -{% endanchor %} - -* [I created a teammate in the UI with FULL ACCESS to a feature, but that teammate still has fewer permissions than a teammate created with the API.](#-I-created-a-teammate-in-the-UI-with-FULL-ACCESS-to-a-feature-but-that-teammate-still-has-fewer-permissions-than-a-teammate-created-with-the-API) -* [Why can't my teammate impersonate a subuser?](#-Why-cant-my-teammate-impersonate-a-subuser) -* [My old multiple user credential could access all new features released by SendGrid. Now that my credential has been migrated to Teammates, I can no longer access new features as they are released.](#-My-old-multiple-user-credential-could-access-all-new-features-released-by-SendGrid-Now-that-my-credential-has-been-migrated-to-Teammates-I-can-no-longer-access-new-features-as-they-are-released) -* [I approved a request for access submitted by one of my teammates. Why was my teammate given full access to the feature?](#-I-approved-a-request-for-access-submitted-by-one-of-my-teammates-Why-was-my-teammate-given-full-access-to-the-feature) -* [Help! One of my administrator teammates has deleted my teammate account!](#-Help-One-of-my-administrator-teammates-has-deleted-my-teammate-account) -* [Can I recover a deleted teammate?](#-Can-I-recover-a-deleted-teammate) -* [Help! My teammate invitation has expired!](#-Help-My-teammate-invitation-has-expired) - -{% anchor h2 %} -I created a teammate in the UI with FULL ACCESS to a feature, but that teammate still has fewer permissions than a teammate created with the API. -{% endanchor %} - -SendGrid has a list of "scopes" (or permissions) for all actions that can be performed with a SendGrid account. Whenever you create a teammate and give that teammate specific permissions to a feature, you are assigning "scopes" of access to that teammate. When setting teammate permissions in the user interface, you are presented with a high level overview of all of SendGrid's scopes. - -When you create a teammate with the Web API v3, you also must specify which permissions to give the new teammate. However, the method used to specify teammate permissions in the API allows for more granular control over exactly which permissions are assigned. In other words, the list of permissions available via the API is more detailed than the list available in the UI. - -If you create a teammate in the UI, but find that it lacks sufficient permissions, then you will have to modify those permissions by making an API call. For more information on how to do this, click here. - -{% anchor h2 %} -Why can't my teammate impersonate a subuser? -{% endanchor %} - -Only **parent SendGrid accounts** and **administrator teammates** may impersonate subusers. A teammate with restricted permissions can not impersonate a subuser, and subusers cannot impersonate other subusers. - -{% anchor h2 %} -My old multiple user credential could access all new features released by SendGrid. Now that my credential has been migrated to Teammates, I can no longer access new features as they are released. -{% endanchor %} - -All non-administrator teammates are restricted from accessing new features released by SendGrid. However, these teammates should still be able to see new features added to the nav bar in the UI. So, all teammates may request access to new SendGrid features. - -Administrator teammates will continue to automatically receive full access to all new SendGrid features. - -{% anchor h2 %} -I approved a request for access submitted by one of my teammates. Why was my teammate given full access to the feature? -{% endanchor %} - -If you are a teammate administrator and you grant an access request to one of your teammates, that teammate will be given full access to the feature. If you want to restrict that teammate's access, you will have to navigate to that teammate's settings and manually change them after you have approved the initial access request. - -{% anchor h2 %} -Help! One of my administrator teammates has deleted my teammate account! -{% endanchor %} - -Any administrator teammate can delete or change the settings of any other administrator teammate. Be careful of who you grant administrator access to! - -{% anchor h2 %} -Can I recover a deleted teammate? -{% endanchor %} - -No, unfortunately deleted teammates can not be recovered. - -{% anchor h2 %} -Help! My teammate invitation has expired! -{% endanchor %} - -Teammate invites are valid for only 7 days. If you requested access, simply request again. If you are an administrator, simply resend the teammate invitation. diff --git a/source/Classroom/Troubleshooting/Authentication/a_custom_field_value_did_not_substitute_during_a_send.md b/source/Classroom/Troubleshooting/Authentication/a_custom_field_value_did_not_substitute_during_a_send.md deleted file mode 100644 index 7c37361dac..0000000000 --- a/source/Classroom/Troubleshooting/Authentication/a_custom_field_value_did_not_substitute_during_a_send.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -seo: - title: A Custom Field value did not substitute during a send. - description: A Custom Field value did not substitute during a send. - keywords: replacement, tag, not, tags, custom, merge, field, substitute, didn't, did -title: A Custom Field value did not substitute during a send. -weight: 0 -layout: page -zendesk_id: 208055357 -navigation: - show: true ---- - -First, check to make sure that there is a value for that custom field associated with the contact in your contact database. If there is no value for a particular custom field, a space will be substituted instead. - -You can search for a specific email address from your **Contacts** page, your **All Contacts** page, or from within a specific list or segment. Simply type the email address, or part of the email addres, you are looking for in the search bar. Once you've found the address, navigate to that contact's profile to check the value of the custom field. - -If you do find that the custom field has an associated value on the contact's profile page, check the spelling of the substitution tag in the content of your campaign. diff --git a/source/Classroom/Troubleshooting/Authentication/certificate_verification_failed.md b/source/Classroom/Troubleshooting/Authentication/certificate_verification_failed.md deleted file mode 100644 index 396afc4ec6..0000000000 --- a/source/Classroom/Troubleshooting/Authentication/certificate_verification_failed.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -seo: - title: Certificate verification failed for smtp.sendgrid.net - description: Certificate verification failed for smtp.sendgrid.net - keywords: certificate, authority, bundle, godaddy -title: Certificate verification failed for smtp.sendgrid.net -weight: 0 -layout: page -zendesk_id: 200182008 -navigation: - show: true ---- - -| - -If you receive this kind of error : "certificate verification failed for [smtp.sendgrid.net](http://smtp.sendgrid.net/)[198.37.144.225]:587: untrusted issuer /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority" - - - -The connection is still encrypted, it's just that your server doesn't have the necessary CA (ceritificate authority) certs to confirm that our certificate is valid. - -You can download the Godaddy CA bundle from [https://certs.godaddy.com/anonymous/repository.pki](https://certs.godaddy.com/anonymous/repository.pki) (grab the one called "gd\_bundle-g2-g1.crt"). Save that somewhere on your server, for instance "/etc/postfix/ssl/gd\_bundle-g2-g1.crt". Finally, tell Postfix where to find it by adding or editing the following line in /etc/postfix/ [main.cf](http://main.cf/): - - - -"smtp\_tls\_CAfile = /etc/postfix/ssl/gd\_bundle-g2-g1.crt" - - - -Restart Postfix to make the change take effect. - - - -If the mailserver communicates with more than just us, You'll want to add the above to your existing CA bundle (frequently called ca-bundle.crt). - - | - diff --git a/source/Classroom/Troubleshooting/Authentication/dns_records_and_underscores.md b/source/Classroom/Troubleshooting/Authentication/dns_records_and_underscores.md deleted file mode 100644 index 19cf339159..0000000000 --- a/source/Classroom/Troubleshooting/Authentication/dns_records_and_underscores.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -st: - published_at: 2016-06-09 - type: Classroom -seo: - title: DNS records and underscores - description: DNS records and underscores - keywords: -title: DNS records and underscores -weight: 0 -layout: page -zendesk_id: 200185218 -navigation: - show: true ---- - -Some DNS providers do not support underscores in zone file entries, however an underscore is required in some DNS entries outlined in the [Whitelabel]({{root_url}}/User_Guide/Settings/Whitelabel/index.html) process. - -If your provider does not allow you to use underscores, you may need to consider changing DNS hosting provider if you want to take advantage of the Whitelabel feature. - -Alternatively, disabling [Automated Security]({{root_url}}/Classroom/Deliver/Sender_Authentication/what_is_automated_security_in_the_whitelabel_settings.html) when Whitelabeling will remove the need to set up the CNAME records with underscores in them that can cause this issue initially. - diff --git a/source/Classroom/Troubleshooting/Authentication/how_do_i_check_the_headers_raw_source_of_an_email.md b/source/Classroom/Troubleshooting/Authentication/how_do_i_check_the_headers_raw_source_of_an_email.md index 51828ab59f..118553e5e7 100644 --- a/source/Classroom/Troubleshooting/Authentication/how_do_i_check_the_headers_raw_source_of_an_email.md +++ b/source/Classroom/Troubleshooting/Authentication/how_do_i_check_the_headers_raw_source_of_an_email.md @@ -50,7 +50,7 @@ Our Support agents may sometimes ask you to give us the raw source or headers of **Yahoo:** -Sadly, Yahoo does not offer an option in their web tool to view the headers from received messages. +Look for the option called "View Raw Message" under the More menu (displayed as 3 dots). diff --git a/source/Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.md b/source/Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.md deleted file mode 100644 index 75ee53c9dd..0000000000 --- a/source/Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -seo: - title: I have created DNS records, but the Whitelabel process is not validating them. - description: I have created DNS records, but the Whitelabel Wizard is not validating them. - keywords: double, cname, spf, dkim, white, whitelabel, dns, validation, validate, wizard, txt, and, confirm, red, x, validated, records, proceed, em, hat, check, email., em., A record, _domainkey, v=spf, out of, twice -title: I have created DNS records, but the Whitelabel process is not validating them. -weight: 0 -layout: page -zendesk_id: 204075436 -navigation: - show: true ---- - -Whitelabeling your account is one of the best things you can do to maintain good deliverability. However, the complexity of setting it up, and the variability of hosting provider settings can sometimes make the experience frustrating. - -A common hurdle that many users encounter during the whitelabel process is that DNS records fail to validate, even though the records were just created! Below are some steps you can take to troubleshoot potential issues with recently created DNS records. - -{% anchor h3 %} -Allow Your DNS Records to Propagate -{% endanchor %} - -9 times out of 10, this validation issue can be solved with a judicious application of time. DNS records must take time to propagate throughout the internet before we can detect if they exist, and are indeed correct. - -Propagation can take anywhere from a few hours to a few days, depending on your DNS host. We've found that popular hosts such as Godaddy and DNSMadeEasy will typically take around an hour or so to propagate new records out to where we can detect them. - -We recommend giving DNS changes at least an hour to propagate, and then trying to validate the records again. If validation still fails, you can move on to verifying your records manually, or contact your DNS host to see if they can speed up the process or manually push the changes through for you. - -{% anchor h3 %} -Verify Your DNS Records Manually -{% endanchor %} - -To check if a DNS record has been propogated, use the simple Unix command **DIG** to check your whitelabel records. The easiest way to do this is to use **Terminal** on a Mac platform. - -Use the commands from the table below to check the accuracy of records. The **ANSWER** section of the output should contain what is displayed in the answer column of the table. If the **ANSWER** section of the dig return is empty, that usually means that either the record does not exist or has yet to propagate. - -Please note that the example records below will differ from those presented to you in the whitelabel process, be sure to use the records that are displayed in the SendGrid.com website. - -Examples: - -{% anchor h3 %} -Domains -{% endanchor %} - -{% anchor h4 %} -Automated Security ON -{% endanchor %} - - - - - - - - - - - - - - - - - - - - - - -
CommandTypeANSWER
dig cname sub.domain.comCNAMEu123456.wl.sendgrid.net
dig cname s1._domainkey.sub.domain.comCNAMEs1.domainkey.u123456.wl.sendgrid.net
dig cname s2._domainkey.domain.comCNAMEs2.domainkey.u123456.wl.sendgrid.net
- -{% anchor h4 %} -Automated Security OFF -{% endanchor %} - - - - - - - - - - - - - - - - - - - - - - -
CommandTypeANSWER
dig mx sub.domain.comMXmx.sendgrid.net
dig txt m1._domainkey.sub.domain.comTXTk=rsa; t=s; p=MIGfMA0GC...
dig txt sub.domainkey.domain.comTXTv=spf1 include:sendgrid.net ~all
- -{% anchor h3 %} -Email Links -{% endanchor %} - - - - - - - - - - - - - - - - - -
CommandTypeANSWER
dig cname links.domain.comCNAMEsendgrid.net
dig cname 123456.domain.comCNAMEsendgrid.net
- -{% anchor h3 %} -IPs -{% endanchor %} - - - - - - - - - - - - -
CommandTypeANSWER
dig a o1.default.domain.comA12.34.56.78 (your SendGrid IP address)
- -![]({{root_url}}/images/terminaldigcname.png) - -You can also use the [DNSLookup](http://mxtoolbox.com/DNSLookup.aspx) tool provided by MxToolbox: simply enter the record you would like to check, and hit enter. - -If you are able to successfully verify your DNS changes manually, and the whitelabel still will not accept them, feel free to contact Support, and we can help you investigate. - -{% anchor h3 %} -Check for TLD Auto-Appending -{% endanchor %} - -Some DNS hosts will automatically add your top-level domain to the end of DNS records you create, which can turn a CNAME for "email.domain.com" into "email.domain.com.domain.com". - -Be sure to follow the convention on existing records in your DNS panel when adding new ones, as sometimes you will only need to add what is to the left of the top-level domain. - -i.e. A CNAME for "email." becomes "email.domain.com" - - -**Use GoDaddy? Watch our handy video guide for whitelabeling!** - - - - -{% anchor h3 %} -Tools -{% endanchor %} - -- Check global propagation: [https://www.whatsmydns.net/](https://www.whatsmydns.net/) -- Check DNS records online: [http://mxtoolbox.com/DNSLookup.aspx](http://mxtoolbox.com/DNSLookup.aspx) - -If you continue to have problems validating your whitelabel or you have further questions that have not been addressed here, please contact our [Customer Support](https://support.sendgrid.com/hc/en-us). diff --git a/source/Classroom/Troubleshooting/Authentication/invalid_smtp_api_header.md b/source/Classroom/Troubleshooting/Authentication/invalid_smtp_api_header.md deleted file mode 100644 index f4a1ef80f6..0000000000 --- a/source/Classroom/Troubleshooting/Authentication/invalid_smtp_api_header.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -seo: - title: Invalid SMTP API header - description: Invalid SMTP API header - keywords: event, smtp api, invalid, header, invalid smtp api header, x-smtpapi -title: Invalid SMTP API header -weight: 0 -layout: page -zendesk_id: 204418493 -navigation: - show: true ---- - -When using the [X-SMTPAPI](https://sendgrid.com/docs/API_Reference/SMTP_API/index.html) header, you may find from time to time that you have an invalid smtpapi header. You may see these errors in your [Email Activity](https://sendgrid.com/docs/Delivery_Metrics/email_activity.html) or [Event Notification](https://sendgrid.com/docs/Apps/event_notification.html) log. When you have these errors it is important to check your email for the details of the invalid smtpapi header. - -_Example [Email Activity](https://sendgrid.com/docs/Delivery_Metrics/email_activity.html):_ - -
- -_Example [Event Notification](https://sendgrid.com/docs/Apps/event_notification.html) log using our [EventKit](https://sendgrid.com/docs/VidGrid/Event_Notification/eventkit.html):_ - -
- -_Example invalid smtpapi header email:_ - -> A message was received from this address by our systems that had errors in the smtpapi header, and cannot be processed. The error detected was: Error decoding SMTP API header: , or ] expected while parsing array, at character offset 50 (before ":{"%name%":["Ben","J...") If you require assistance in working with the SMTP API, please contact us at [support@sendgrid.com](mailto:support@sendgrid.com) - -In this email you can find all the details you need to begin troubleshooting your invalid smtpapi header. In our example we can see the error happened "at character offset 50 (before ":{"%name%":["Ben","J...")". If we review the X-SMTPAPI header that was sent we should find what caused the issue. - -_Example invalid smtpapi header:_ - -> {"to":["ben@sendgrid.com","joe@sendgrid.com","sub":{"%name%":["Ben","Joe"],"%role%":["%sellerSection%","%buyerSection%"]},"section":{"%sellerSection%":"Seller information for: %name%","%buyerSection%":"Buyer information for: %name%"},"category":["Orders"],"unique\_args":{"orderNumber":"12345","eventID":"6789"}} - -Looking at the content of the header before "character offset 50" we can focus our attention and find the issue: - -> {"to":["ben@sendgrid.com","joe@sendgrid.com","sub" - -Looking at this we can see that the closing of the "to" section did not happen. The "to" section should have been: - -> "to":["ben@sendgrid.com","joe@sendgrid.com"] - -To either prevent or troubleshoot issues like this you can run your JSON through our [SMTP API Header Validator](https://sendgrid.com/docs/Utilities/smtpapi_validator.html). Additionally, [JSONLint](http://jsonlint.com/) or [JSONLintCompressor](http://jsonlint.com/?reformat=compress) can be used to help as well. - -If you still need help, please use the links below. - - diff --git a/source/Classroom/Troubleshooting/Authentication/list_upload_troubleshooting.md b/source/Classroom/Troubleshooting/Authentication/list_upload_troubleshooting.md deleted file mode 100644 index a800c8c743..0000000000 --- a/source/Classroom/Troubleshooting/Authentication/list_upload_troubleshooting.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -seo: - title: List Upload Troubleshooting - description: Having trouble uploading a list in Marketing Campaigns? Learn common solutions here... - keywords: marketing, campaigns, csv, upload, contacts, format, list, header, error, UTF-8 -title: List Upload Troubleshooting -weight: 0 -layout: page -navigation: - show: true ---- - -{% info %} -In the case of a list upload failure, you may receive an email from SendGrid. Please check the email from SendGrid containing the results of your CSV upload, including a downloadable error report. - -![]({{root_url}}/images/listupload_error.png) - -{% endinfo %} - -{% anchor h2 %} General Formatting Rules {% endanchor h2 %} - -General rules and guidance to follow when formatting a CSV to upload into Marketing Campaigns. - -{% anchor h3 %} Character Encoding {% endanchor h3 %} - -If your contacts list has non-English characters, please make sure that you're using a CSV file that is UTF-8 encoded. - - -{% anchor h3 %} Not all addresses populate in UI {% endanchor h3 %} - -SendGrid will remove duplicate and invalid email addresses (including email addresses with special characters) from your list during upload, so the number of contacts can potentially change between your CSV and your Marketing Campaigns list. - - -{% anchor h3 %} Text that looks like a number {% endanchor h3 %} - -Make sure that you don’t have text fields that look like numbers. Text that look like numbers are those that contain punctuation characters like a dash, underscore, parenthesis, or multiple dots. - -``` -- US Zip Code: 80202-1713 -- Phone numbers: “(555) 555-5555” or “555.555.5555” -- Monetary Values with the currency indicator such as $3.50 or €5.73 -``` -{% anchor h3 %} CSV Header {% endanchor h3 %} - -- Header fields can be blank in your CSV, but must be named and have their type defined later during the upload process. - -![]({{root_url}}/images/listupload_5.png) - -{% anchor h3 %} Date formatting {% endanchor h3 %} - -Properly format any dates in your CSV. If you created your CSV with Excel and it is not displaying properly, force the date format before exporting to CSV. Use one of the following date formats: `MM/DD/YYYY, MM/D/YYYY, M/D/YYYY, or M/DD/YYYY` - -{% anchor h3 %} I have more than one of the same email in my database {% endanchor h3 %} - -With SendGrid’s Marketing Campaigns feature, the unique identifier is the email address. So, if you upload the same email address multiple times, the custom field data associated with that email will be updated with each upload to the most recently uploaded/updated information. This feature helps prevent you from accidentally emailing the user after they have unsubscribed. - -What you may want to do is add logic to set a custom field, based on the reason why you have duplicate emails in your system (for example multiple product lines) and then segment your user to be in lists based on those custom fields. - -**‹ ** [Custom Fields](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/custom_fields.html) - - -{% anchor h2 %} Specific Upload Errors {% endanchor h2 %} - -Listed below are a few distinct errors you may encounter when uploading a CSV to Marketing Campaigns, along with tips to correct the root issue. - -{% anchor h3 %} We were unable to detect an email column in the CSV file headers. The email column must always have a header of "email" {% endanchor h3 %} - -- If there is a header labeled “email”, try moving it to the column A, so it is the first header in your list. -- Your CSV _must_ include an email header. - -![]({{root_url}}/images/listupload_1.png) - -{% anchor h3 %} Some of your custom fields have not been selected {% endanchor h3 %} - -- Look for hidden characters in your CSV file if you have worked with the file multiple times and made some adjustments to the data. -- A common fix for this error would be to select all and copy your data to a new CSV spreadsheet. This should remove any hidden characters. - -![]({{root_url}}/images/listupload_2.png) - -{% anchor h3 %} Each custom field can only be applied to a column once. Please check your columns and try again {% endanchor h3 %} - -- Check your CSV for duplicate fields, especially fields that have matching information as your “email”, “first_name” and “last_name” fields. These are reserved field names, and cannot be edited. -- For example, if you have a “Name” field, it may conflict with your “first_name” reserved field. - -![]({{root_url}}/images/listupload_3.png) - -{% anchor h3 %} We were unable to detect any headers in your CSV file {% endanchor h3 %} - -- Include headers at the top of each column. The “email” header is required for all CSV uploads. Header fields can be blank in your CSV, but must be defined later during the upload process. - -![]({{root_url}}/images/listupload_4.png) - -{% anchor h3 %} Float type conversion error {% endanchor h3 %} - -- Categorize dashes or decimal places that are past the hundredth place as text_fields (-100, 123.123 are text fields, 100, 12.12 can be number fields). -Number fields can include monetary values without the currency symbols. For example, 19.95 would be a number field, and $19.95 including the ($) would be a text field. -- As you are uploading your CSV, make sure you select the correct fields for your Field type. - -![]({{root_url}}/images/listupload_table.png) diff --git a/source/Classroom/Troubleshooting/Authentication/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.md b/source/Classroom/Troubleshooting/Authentication/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.md index e93daf98fe..6474141e63 100644 --- a/source/Classroom/Troubleshooting/Authentication/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.md +++ b/source/Classroom/Troubleshooting/Authentication/my_emails_are_displaying_as_on_behalf_of_or_via_in_some_mail_clients.md @@ -17,7 +17,7 @@ A handful of ISPs and mail clients, such as Gmail or Outlook, will display a mes -By default, SendGrid signs all email with DKIM to improve deliverability with recipient domains. However, when using accounts that do not include Whitelabeling, this means that the domain in the 'from' field will not have the proper DNS record to authenticate the e-mail. Because of this, SendGrid inserts a Sender header as either sendgrid.me or sendgrid.info, and the e-mail can then be properly authenticated. +By default, SendGrid signs all email with DKIM to improve deliverability with recipient domains. However, when using accounts that do not include sender authentication, this means that the domain in the 'from' field will not have the proper DNS record to authenticate the e-mail. Because of this, SendGrid inserts a Sender header as either sendgrid.me or sendgrid.info, and the e-mail can then be properly authenticated. -You can solve this display issue by matching the domain in your 'from' address to what you have set within your account Whitelabel wherever possible. Additionally IP whitelabeling is available for Pro packages and above. +You can solve this display issue by matching the domain in your 'from' address to what you have set within your account sender authentication wherever possible. Additionally reverse DNS is available for Pro packages and above. diff --git a/source/Classroom/Troubleshooting/Authentication/whitelabel_video_tutorials.md b/source/Classroom/Troubleshooting/Authentication/whitelabel_video_tutorials.md deleted file mode 100644 index 55831cf3a8..0000000000 --- a/source/Classroom/Troubleshooting/Authentication/whitelabel_video_tutorials.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -st: - published_at: 2016-05-16 - type: Classroom -seo: - title: Whitelabel Video Tutorials - description: Whitelabel Video Tutorials - keywords: whitelabel, video, spf, dkim, domain, links, ip, whitelabeled -title: Whitelabel Video Tutorials -weight: 0 -layout: page -zendesk_id: 0 -navigation: - show: true ---- - -{% anchor h2 %} -Table of Contents -{% endanchor %} - -* [Whitelabeled Domains](#-Whitelabeled-Domains) -* [Email Links](#-Email-Links) -* [IP Whitelabels](#-IP-Whitelabels) -* [Whitelabeling with GoDaddy](#-Whitelabeling-with-GoDaddy) -* [Whitelabeling with Hover](#-Whitelabeling-with-Hover) - -*************** - -{% anchor h3 %}Whitelabeled Domains{% endanchor %} - - - - - -{% anchor h3 %}Email Links{% endanchor %} - - - - - -{% anchor h3 %}IP Whitelabels {% endanchor %} - - - - - -{% anchor h3 %}Whitelabeling with GoDaddy{% endanchor %} - - - - - -{% anchor h3 %}Whitelabeling with Hover{% endanchor %} - - diff --git a/source/Classroom/Troubleshooting/Authentication/you_have_used_a_reserved_field_name_for_your_custom_field.md b/source/Classroom/Troubleshooting/Authentication/you_have_used_a_reserved_field_name_for_your_custom_field.md deleted file mode 100644 index 1aac48fc8b..0000000000 --- a/source/Classroom/Troubleshooting/Authentication/you_have_used_a_reserved_field_name_for_your_custom_field.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -seo: - title: "You have used a reserved field name for your custom field" - description: "You have used a reserved field name for your custom field" - keywords: failed, create, upload, name, custom, created_at, updated_at, last_emailed, last_clicked, last_opened, field, reserved, unique, first_name, last_name -title: "You have used a reserved field name for your custom field" -weight: 0 -layout: page -zendesk_id: 206923947 -navigation: - show: true ---- - -When creating Custom Fields, or uploading a list with customized headers in our Marketing Campaigns features, you may encounter the following error: - -![]({{root_url}}/images/Cursor_and_customfeilduniqueerror_png.png) - -**This is because you are attempting to use a Custom Field that is already reserved by Sendgrid for internal purposes.** - -**These fields, with the exceptions of email, first\_name, and last\_name, can NOT be edited.** - -Reserved fields are used to track useful metrics for your contacts by default. Trying to pass additional data into some of these field names can cause inaccuracies in your Contacts. - - - -Here is a short list of the Reserved Custom Fields: - - - - - - - - - - - - - -
Field NameField Type
idtext
first_nametext
last_nametext
emailtext
liststext
created_atdate
updated_atdate
last_emaileddate
last_clickeddate
last_openeddate
- -![]({{root_url}}/images/SendGrid_Marketing_Campaigns.png) diff --git a/source/Classroom/Troubleshooting/Delivery_Issues/max_connection_limit.md b/source/Classroom/Troubleshooting/Delivery_Issues/max_connection_limit.md deleted file mode 100644 index 7536c32286..0000000000 --- a/source/Classroom/Troubleshooting/Delivery_Issues/max_connection_limit.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -seo: - title: ISP-Suggested Max Connection Limit - description: Deferral event due to reaching a max connection limit. - keywords: throttled, event, connection, limit, delivered, no, delay, throttle, processed, IPS, available, per-domain, connetion, IPs were throttled by recipient server, IPs reached ISP-suggested hourly limits, IPs reached ISP-suggested max connection limits http://send.gd/1uKnEBh, suggested, hourly, max, limits -title: ISP-Suggested Max Connection Limit -weight: 0 -layout: page -navigation: - show: true ---- - -In your logs, you may see the following error message accompanying a deferral event: - -{% codeblock %} -Email was deferred due to the following reason(s): ["IPs reached ISP-suggested max connection limits: http://send.gd/1uKnEBh"] -{% endcodeblock %} - -{% anchor h3 %} -What's that about? -{% endanchor %} - -I'm glad you asked. We've recently updated the infrastructure that handles the actual sending of mail off to it's intended recipients, specifically updated in regards to sending rate. - -{% anchor h3 %} -What's wrong with my IPs? -{% endanchor %} - -Nothing! This is simply due to the fact that most of the time we are sending mail much faster than most ISPs can accept it. Rather than turning the fire hose on full-blast, we create one of these deferral events to control the rate of delivery by ISP to help prevent throttling and spam folder delivery. Sending too much mail too fast is a great way to get on an ISP's naughty list. - -We spend a lot of time tuning the rate of delivery on an ISP by ISP basis, and these deferral events are simply proof that this system is working for you to keep ISPs happy with your throughput, regardless of your sending habits. - -{% anchor h3 %} -What do I need to do? -{% endanchor %} - -You don't need to take any further action. - -We'll continue to attempt delivery of Deferred messages for up to 72 hours, after which time we may [drop the message]({{root_url}}/Classroom/Deliver/Undeliverable_Email/my_emails_are_being_dropped.html) if the ISP still isn't able accept the messages. These deferrals may sometimes result in delays between an email's Processed event and the eventual Delivery event, but again, this is simply us optimizing the rate at which email sends are attempted. diff --git a/source/Classroom/Troubleshooting/Delivery_Issues/max_hourly_limit.md b/source/Classroom/Troubleshooting/Delivery_Issues/max_hourly_limit.md deleted file mode 100644 index 90ddca02dc..0000000000 --- a/source/Classroom/Troubleshooting/Delivery_Issues/max_hourly_limit.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -seo: - title: ISP-Suggested Hourly Limits - description: Deferral event due to reaching hourly limit. - keywords: throttled, event, connection, limit, delivered, no, delay, throttle, processed, IPS, available, per-domain, connetion, IPs were throttled by recipient server, IPs reached ISP-suggested hourly limits, IPs reached ISP-suggested max connection limits http://send.gd/1uKnEBh, suggested, hourly, max, limits -title: ISP-Suggested Hourly Limits -weight: 0 -layout: page -navigation: - show: true ---- - -In your logs, you may see the following error message accompanying a deferral event: - -{% codeblock %} -Email was deferred due to the following reason(s): ["IPs reached ISP-suggested hourly limits" http://send.gd/1uKnEBh] -{% endcodeblock %} - -SendGrid can automatically warmup dedicated IP addresses by limiting the amount of mail that can be sent through them per hour, with the limit determined by how long the IP address has been in warmup. See the [warmup schedule]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.html) for more details. - -If you have existing warm IPs as well as new IPs that need warming, any mail beyond the hourly maximum limit will overflow to your existing warm IPs. - -If there are no existing warm IPs, any requests made above the hourly maximum limit will overflow to our Shared IP Warmup clusters for sending. If your sending reputation is below 85, you will not be able to use these Shared IP Warmup clusters. - -An IP in warmup will always follow SendGrid’s Warmup Schedule. Please consider a measured approach when sending on a new IP to allow for proper IP warmup. You can read more on [the importance of warming up a new IP]({{root_url}}/User_Guide/warming_up.html) and consider your sending volume for best deliverability. diff --git a/source/Classroom/Troubleshooting/Delivery_Issues/my_client_is_complaining_that_they_have_not_received_an_email.md b/source/Classroom/Troubleshooting/Delivery_Issues/my_client_is_complaining_that_they_have_not_received_an_email.md deleted file mode 100644 index 6e6f026eb1..0000000000 --- a/source/Classroom/Troubleshooting/Delivery_Issues/my_client_is_complaining_that_they_have_not_received_an_email.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -seo: - title: My client is complaining that they have not received an email. - description: My client is complaining that they have not received an email. - keywords: spam, bounces, email, block, invalid, deliverability, delivery -title: My client is complaining that they have not received an email. -weight: 0 -layout: page -zendesk_id: 203929428 -navigation: - show: true ---- - -{% info %} Subscriber reporting non-delivery or delays? Check our _[Status Page](http://status.sendgrid.com/)_ for the current state of all SendGrid Services. {% endinfo %} - -If a subscriber is complaining that they have not received your email there are a few things you can check. - -1. Search for the email in [Email Activity](https://app.sendgrid.com/email_activity?). If we successfully delivered the message you will see a _delivered_ event with the time of delivery. If you do not see the email come up, you can click on search options and make sure processed and deferred are checked. A _processed_ event indicates that we actually got the request from you. _Deferred_ events show if there are issues or delays with the receiving server accepting the message. - -2. If you do see a delivered event for the message in Email Activity, you can expand it and look at the reason code. You should see a message with 250 OK. Often times the receiving server will "queue the message" and it will say "Queued" right after 250 OK. This means the receiving server accepted the message but is holding it. - -3. If you see deferred events in Email Activity, then expand the event and look at the deferral reason. Is it a problem with connection? Is the user's inbox full? SendGrid will try and deliver deferred messages for up to 72hrs before the users email will end up on the [bounce list]({{root_url}}/User_Guide/Suppressions/bounces.html). - -4. Have the user check their SPAM folder. - -5. Check your suppression lists; [bounces]({{root_url}}/User_Guide/Suppressions/bounces.html), [blocks]({{root_url}}/User_Guide/Suppressions/blocks.html), [spam reports]({{root_url}}/User_Guide/Suppressions/spam_reports.html), [invalid email]({{root_url}}/User_Guide/Suppressions/invalid_emails.html). - -If you still have no luck tracking down the email after all of the above, [contact support](http://support.sendgrid.com/hc/en-us). diff --git a/source/Classroom/Troubleshooting/Delivery_Issues/testing_your_connectivity_to_sendgrids_smtp_relay_using_telnet.md b/source/Classroom/Troubleshooting/Delivery_Issues/testing_your_connectivity_to_sendgrids_smtp_relay_using_telnet.md deleted file mode 100644 index 236dfa4e3e..0000000000 --- a/source/Classroom/Troubleshooting/Delivery_Issues/testing_your_connectivity_to_sendgrids_smtp_relay_using_telnet.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -seo: - title: Testing your connectivity to SendGrid's SMTP relay using Telnet - description: Testing your connectivity to SendGrid's SMTP relay using Telnet - keywords: telnet, ports, connection, smtp -title: Testing your connectivity to SendGrid's SMTP relay using Telnet -weight: 0 -layout: page -zendesk_id: 200182038 -navigation: - show: true ---- - - - - -#Starting your Telnet connection: - -To begin, choose one of the following options based on the type of computer you are using. - ->**Windows:** Open your Windows menu, type **cmd* into the search function, and press enter. - ->**Mac/Unix:** launch the Terminal application. - -You should now be looking at a DOS-prompt style window with a blinking cursor in the top left-hand corner, you will use this window to input the commands to initiate a telnet connection. Use the progression below to walk you through the connection. - -#Things to know before initiating the Telnet Authentication: - -1. For the first command in the telnet authentication test, **the "#" symbol will need to be replaced with one of our recommended ports.** We accept unencrypted and TLS connections on ports **25**, **587**, & **2525**. - -2. You will be required to enter a base 64 encoded version of your SendGrid username and password. To encode your username and password, please visit the following URL: https://www.base64encode.org/ - -#Telnet Authentication Walkthrough: -Below is a walkthrough of a basic telnet authentication. **Every line starting with ">" indicates that the text following it is a command you will need to type in followed by pressing the ENTER key afterwards.** - - >telnet smtp.sendgrid.net # - 220 xxxx ESMTP service ready - >EHLO - 250-xxxx250-8BITMIME250-SIZE 20480000250-AUTH=PLAIN LOGIN250-AUTH PLAIN LOGIN250 STARTTLS - >auth login - 334 VXNlcm5hbWU6 - >Enter your BASE64 encoded SendGrid username here. - 334 UGFzc3dvcmQ6 - >Enter your BASE64 encoded SendGrid password here. - 235 Authentication successful. * - -####* Getting this far indicates that your connection to smtp.sendgrid.net over the chosen port is open, and your username and password are valid! - - - -#Sending a message using Telnet: -Below is a walkthrough of how to send a message via telnet. **Every line starting with ">" indicates that the text following it is a command you will need to type in followed by pressing the ENTER key afterwards.** - - >mail from: fromaddress@domain.com - 250 Sender address accepted - >rcpt to: toaddress@domain.com - 250 Recipient address accepted - >data - 354 Continue - >To:To Name - >From: From Name - >Subject:Testing - > *You need to enter one blank line before you start the actual body of the message - >This is where the body of the message you would like to send goes. - >. *Typing a period(.) tells us you are finished, and to send the message. - 250 Delivery in progress - >quit - 221 See you later - Connection to host lost. - - ->**Note**: If upon attempting 'telnet smtp.sendgrid.net #', you receive an error stating "'telnet' is not recognized as an internal or external command, operable program or batch file." this means that Telnet is not installed on your machine. This can be done by visiting your "Add and Remove Progams" section within your Control Panel, and installing the 'Telnet Client' and 'Telnet Server' packages within 'Turn Windows features on or off". diff --git a/source/Classroom/Troubleshooting/Delivery_Issues/troubleshooting_delays_and_latency.md b/source/Classroom/Troubleshooting/Delivery_Issues/troubleshooting_delays_and_latency.md index fa63fce7b4..ec6eea8169 100644 --- a/source/Classroom/Troubleshooting/Delivery_Issues/troubleshooting_delays_and_latency.md +++ b/source/Classroom/Troubleshooting/Delivery_Issues/troubleshooting_delays_and_latency.md @@ -17,7 +17,7 @@ navigation: ### 1. Check these suggestions first: -**1.** If you are integrated with Sendgrid using code, we _highly_ recommend using the official Sendgrid libraries available on our [Github account](https://github.com/sendgrid). These are written with efficiency in mind. If you need help getting started with our libraries, check out our [Code Workshop](https://sendgrid.com/docs/Utilities/code_workshop.html) tool. +**1.** If you are integrated with SendGrid using code, we _highly_ recommend using the official SendGrid libraries available on our [Github account](https://github.com/sendgrid). These are written with efficiency in mind. If you need help getting started with our libraries, check out our [Code Workshop](https://sendgrid.com/docs/Utilities/code_workshop.html) tool. **2.** You can use our [SMTPAPI]({{root_url}}/API_Reference/SMTP_API/index.html) to greatly increase your message throughput. As with SMTP, 100 messages can be sent with each connection, but there can be 1000 [TO: recipients](https://sendgrid.com/docs/API_Reference/SMTP_API/using_the_smtp_api.html) for each message using the x-smtpapi header. You can use this option through [SMTP]({{root_url}}/Classroom/Basics/Email_Infrastructure/recommended_smtp_settings.html) sending as well as the [Web API v3](https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html). @@ -66,10 +66,10 @@ The results provided should show the exact journey a message takes from one Mail 2. Support may ask you for a PCAP sometimes during issue troubleshooting, here is an excellent guide on how to perform the capture and begin using Wireshark [here](http://www.howtogeek.com/104278/how-to-use-wireshark-to-capture-filter-and-inspect-packets/). Make sure that you capture when attempting to send a single message to SMTP.sendgrid.net. Once we receive the PCAP file from the you, we can open it up in Wireshark on our side. The steps below are the same step[s we would take to analyze such a file, so feel free to follow along! 1. Filter on SMTP protocol: First things first. Let’s go ahead and use the filter to peer through the rest of the noise of the capture, and find what we are really interested in. To apply the filter, type “smtp” into the filter box as shown below: ![]({{root_url}}/images/CL_Troubleshooting_Delivery_Issues_16.png) - 2. Change time view value: Next thing you want to do is to change the time value. As per Wireshark default, it will be currently listed as Year:Month:Day - Hour:Minutes:Seconds:Milliseconds. To help troubleshoot the delay, go ahead and change this time display to show “seconds since previously displayed packet” and “milliseconds” + 2. Change time view value: Next thing you want to do is to change the time value. As per Wireshark default, it will be currently listed as Year:Month:Day - Hour:Minutes:Seconds:Milliseconds. To help troubleshoot the delay, go ahead and change this time display to show “seconds since previously displayed packet” and “milliseconds” ![]({{root_url}}/images/CL_Troubleshooting_Delivery_Issues_15.png) 3. Follow TCP stream: This will allow you to see the transaction in a logical view. You can also see and verify the content of the message transmitted in plain text. To do so, go to “analyze->follow TCP Stream” ![]({{root_url}}/images/CL_Troubleshooting_Delivery_Issues_17.png) - 4. Expert information tool: This view can let you know right away if there are any red flags with which you should be concerned. To access the expert info, navigate to “analyze->expert info”. When viewing this information, pay attention to the “errors”, “notes”, and “chats” sections. From the errors section, you can see if there are any big errors such as a bad checksum as shown in the example. Keep in mind that It's usually OK to ignore checksum errors on outbound packets. When looking at the notes, it will inform you of suspected concerns. In the example, the notes section informs me of a suspected retransmission on packet 113. This is important, as we will determine later. In the chat section, you can see the sequences and protocols of interest with the summaries. So for example, you can see the connection established, the POST, and awaiting a response. + 4. Expert information tool: This view can let you know right away if there are any red flags with which you should be concerned. To access the expert info, navigate to “analyze->expert info”. When viewing this information, pay attention to the “errors”, “notes”, and “chats” sections. From the errors section, you can see if there are any big errors such as a bad checksum as shown in the example. Keep in mind that It's usually OK to ignore checksum errors on outbound packets. When looking at the notes, it will inform you of suspected concerns. In the example, the notes section informs me of a suspected retransmission on packet 113. This is important, as we will determine later. In the chat section, you can see the sequences and protocols of interest with the summaries. So for example, you can see the connection established, the POST, and awaiting a response. ![]({{root_url}}/images/CL_Troubleshooting_Delivery_Issues_18.png) 5. Calculate Time: Last but not least, it is time to apply a quantitative value to our latency we can see within the transaction. The best way to go about this is to change the time view settings once again. This time, you will want to change it to view to show “time of day” once again leaving the display in milliseconds. If you do the math you are able to determine the total round-trip time for the transaction. diff --git a/source/Classroom/Troubleshooting/index.html b/source/Classroom/Troubleshooting/index.html index 4597599a1a..c80d110df4 100644 --- a/source/Classroom/Troubleshooting/index.html +++ b/source/Classroom/Troubleshooting/index.html @@ -64,7 +64,6 @@

Authentication, Em diff --git a/source/Glossary/7_bit_encoding.md b/source/Glossary/7_bit_encoding.md index 11f793f6c8..4d7711a968 100644 --- a/source/Glossary/7_bit_encoding.md +++ b/source/Glossary/7_bit_encoding.md @@ -19,4 +19,4 @@ In this encoding we get 7 digit representations in 0s and 1s for each of the Eng SendGrid requires 7 bit encoding in our [SMTPAPI categories header]({{root_url}}/API_Reference/SMTP_API/categories.html). -For more information, visit Wikipedia for the entire [history of ASCII](http://en.wikipedia.org/wiki/ASCII). \ No newline at end of file +For more information, visit Wikipedia for the entire [history of ASCII](http://en.wikipedia.org/wiki/ASCII). diff --git a/source/Glossary/a_record.md b/source/Glossary/a_record.md index a74fcbc4fe..515ea9e9cc 100644 --- a/source/Glossary/a_record.md +++ b/source/Glossary/a_record.md @@ -10,14 +10,8 @@ navigation: show: false --- -The A record is what links your dedicated IP address to your chosen subdomain. Creating this record will, for example, point traffic for o1.subdomain.yourdomain.com back to your dedicated IP, and vice versa. +The A record (address record) links your dedicated IP address to your chosen domain. It does this by mapping your domain to your IP address through records that you export from SendGrid and upload into your DNS host. -You can create multiple A records for a domain with as many IP addresses as you wish, however you can only [whitelabel]({{root_url}}/User_Guide/Setting_Up_Your_Server/Whitelabeling/index.html) one IP to one domain at a time. +If your domain+ subdomain is `marketing.example.com`, and your dedicated IP address is `101.10.10.101`, setting up the SendGrid A record links your domain with your dedicated IP address - so anything sent over your domain associates with your dedicated IP, and anything sent over your dedicated IP associates with your domain. -{% anchor h2%} -Example A Record -{% endanchor %} - -What it should look like: -```em.yourdomain.com. | A | 192.168.250.1``` diff --git a/source/Glossary/black_hat_sender.md b/source/Glossary/black_hat_sender.md index 00b6b7edd9..bf12f6de82 100644 --- a/source/Glossary/black_hat_sender.md +++ b/source/Glossary/black_hat_sender.md @@ -9,11 +9,11 @@ navigation: show: false --- -A black hat sender is a sender/company who sends email to recipients who either send to recipients who have not given permission to senders to send to them. +A black hat sender is a sender or company who sends email to recipients that didn't specifically requested to get emails from that sender. It is somebody that delivers unsolicited emails to recipients that never requested them. -Not all black hat activity is intentional, though. Even senders who have their recipient's permission but send an excessive amount of email or who send at an alarming frequency may be flagged by users as “spam”. These senders will be identified by the recipients’ ISP, which may throttle the sender's email, send it to spam traps, or totally block the emails. +Not all black hat activity is intentional, though. Even senders who have their recipient's permission but send an excessive amount of email or who send at an alarming frequency may be flagged by users as “spam”. These senders will be identified by the recipients’ ISP, which may throttle the sender's email, send it to spam traps, or totally block the emails. -If your emails are not getting the clicks and opens you expect, you may want to re-evaluate your sending habits. Also, please take a look at our [email deliverability tips]({{root_url}}/Classroom/Deliver/index.html) for help in being a white hat sender. +If your emails are not getting the clicks and opens you expect, you may want to re-evaluate your sending habits. Also, please take a look at our [email deliverability tips]({{root_url}}/Classroom/Deliver/index.html) for help in being a white hat sender. For more information: diff --git a/source/Glossary/blacklists.md b/source/Glossary/blacklists.md index e4d941a348..5c556fa01d 100644 --- a/source/Glossary/blacklists.md +++ b/source/Glossary/blacklists.md @@ -12,56 +12,88 @@ layout: page navigation: show: false --- +- [Delisting Shared IP Plans](#-Delisting-Shared-IP-Plans) +- [Delisting Dedicated IP Plans](#-Delisting-Dedicated-IP-Plans) +- [Checking Your IP Address](#-Checking-Your-IP-Address) +- [Delisting Request Forms](#-Delisting-Request-Forms) -A Blacklist is a list of IP addresses that are known to send unsolicited and/or unwanted emails. ISPs and enterprises use blacklists to identify and filter illegitimate mail streams. Blacklisting can also occur for specific sending domains in addition to sending IPs. +A Blacklist is a list of IP addresses that have been detected sending unsolicited and unwanted emails. Inbox service providers (like Gmail, Microsoft, Yahoo, and AOL) and enterprises use blacklists to identify and filter illegitimate mail streams. Blacklisting can also occur for specific sending domains in addition to sending IPs. -You may have found in your Block List or Bounce list that your sending IP address and or domain have been blacklisted by an ISP. What this means is that this ISP has determined they have an issue with what you are sending or how often you are sending mail. This ISP will most likely not accept mail from you anymore until you request to be de-listed. If you are sending mail you will want to try your best to stay off of blacklists because certain ones can affect your deliverability. Our Compliance and Support Teams keep a close eye on which of our IP’s end up on a blacklist and we try as quickly as possible to resolve the issue however more often then not it will require the user sending the mail to contact the ISP. +All major ISPs use some form of blacklisting service to protect their customers from malicious emails, although the deliverability impact can vary depending on the blacklisting service that lists the IP. If you find that your IP address is on the blacklist of one the many legitimate services, then submit a delisting request. -A good practice is to make sure you are are not sending spam. You can check your spareness score here mail-tester.com and try to fix any issue that comes up in your score. Secondly, if you are on a Pro 100k plan or above account you have a dedicated IP address. We like to always recommend IP warmup when you are starting out. We have an [IP warmup process]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.html) we can implement for you or you can limit your sending in the beginning to about 1000 per day and then just double your requests every other day. - -Ending up on a [blacklist]({{site.support_url}}/hc/en-us/articles/200181968) can be detrimental to your domain’s email deliverability.  All major ISPs use some form of blacklisting service in order to protect their customers from malicious emails, although not all blacklisting services are actively being used. If a listing service ever asks you pay a fee for a delisting request, or if they say that they do not accept delisting requests, then you should not waste your time trying to get your domain/IP delisted because these services are rarely, if ever, used. However, if you find that your IP address has been blacklisted by one of the many legitimate services, then submitting a delisting request is the top priority.  Depending on the level of your account, you should approach a blacklisting in one of two ways: +SendGrid keeps a close eye on our IP’s, and we try as quickly as possible to resolve any issues with blacklists. However, getting your IP off the blacklist often requires the user sending the mail to contact the ISP. {% anchor h2 %} -Shared IP Plans +Delisting Shared IP Plans {% endanchor %} -If you are on one of our shared IP plans and you notice a block message based on one of our IP addresses then please contact our Support team.  We will handle all delisting requests for our shared IP users. +When on a Free or Essentials plan, your account is using shared IP pools - you are sharing IP addresses with many other customers, and there is the potential of being adversely affected by senders in the same pool. +When one of the shared IP pools gets blacklisted, SendGrid receives an automatic notification and handles the delisting request on behalf of our customers. Removal time varies depending on the blacklist. + +{% info %} +SendGrid is unable to move your account to a new IP pool. The best way to not be impacted by other senders is to get a dedicated IP on a Pro or higher plan. +{% endinfo %} {% anchor h2 %} -Dedicated IP Plans +Delisting Dedicated IP Plans {% endanchor %} -We ask that our dedicated IP plan users make the initial delisting request in the event that they discover their SendGrid IP on a blacklist. These IP addresses are only assigned to one account at a time, so we expect those users to take responsibility for all of the mail that is sent through their account.  SendGrid will still be happy to step in and assist with these delisting requests if the listing service requires the IP administrator to take action, or if the delisting form is too complicated. +We ask that our dedicated IP plan users make the initial delisting request if they discover their +SendGrid IP on a blacklist. SendGrid is happy to step in and assist with these delisting requests if the listing service requires the IP administrator to take action, or if the delisting form is too complicated. -*Please note:  in the event that a sending domain (and not the IP address) is blacklisted, that domain’s controller will be responsible for handling the delisting request.* +{% info %} +Please note: If a sending domain (and not the IP address) is blacklisted, that domain’s controller is responsible for handling the delisting request. +{% endinfo %} {% anchor h2 %} Checking Your IP Address {% endanchor %} Here are two aggregation websites that anyone can use to check on the status of their IP: - -* [http://multirbl.valli.org/](http://multirbl.valli.org/) -* [http://www.mxtoolbox.com/blacklists.aspx](http://www.mxtoolbox.com/blacklists.aspx) +- [MulitRBL](http://multirbl.valli.org/) +- [MXToolbox](http://www.mxtoolbox.com/blacklists.aspx) {% anchor h2 %} Delisting Request Forms {% endanchor %} Below are links to the delisting forms used by the more popular external blacklisting services: +- [AOL](https://postmaster.aol.com/sa-ticket) +- AT&T - *email abuse_rbl@abuse-att.net* +- [Barracuda](http://www.barracudacentral.org/rbl/removal-request) +- [CASA](http://www.anti-spam.org.cn/?Locale=en_US) +- [Comcast](http://postmaster.comcast.net/block-removal-request.html) +- [Google](https://support.google.com/mail/contact/msgdelivery) +- [Invalument](http://www.invaluement.com/removal/) +- [Manitu](http://www.dnsbl.manitu.net/index.php?language=en) +- [McAfee](https://secure.mcafee.com/apps/mcafee-labs/threat-feedback.aspx) +- [Mimecast](http://www.mimecast.com/senderfeedback) +- [Office 365](https://sender.office.com/) +- [SORBS](http://www.sorbs.net/) +- [SpamCop](https://www.spamcop.net/bl.shtml) +- [Spam Rats](http://www.spamrats.com/removal.php) +- [Spamhaus](https://www.spamhaus.org/lookup/) +- [SURBL](http://www.surbl.org/surbl-analysis) +- [Trend Micro](https://www.ers.trendmicro.com/) +- [URIBL](https://admin.uribl.com/) +- [Yahoo](http://help.yahoo.com/l/us/yahoo/mail/postmaster/bulkv2.html) + +{% anchor h2 %} +Gmail, Yahoo, Hotmail and AOL Bulk Email Sender Guidelines +{% endanchor %} + +- [Gmail Email Sender Guidelines](https://support.google.com/mail/answer/81126) +- [Yahoo Email Sender Guidelines](https://help.yahoo.com/kb/mail-for-desktop/SLN3435.html?impressions=true) +- [Hotmail/Outlook/Live Bulk Email Sender Guidelines](https://mail.live.com/mail/policies.aspx) +- [AOL Bulk Email Sender Guidelines](https://postmaster.aol.com/best-practices) + +If you are sending mail using these guidelines and still have problems to deliver email to those email providers, you can contact the ISP support by the following URL: + +- [Gmail Bulk Sender Contact Form](https://support.google.com/mail/contact/bulk_send_new?visit_id=1-636427436775630765-3555263264&rd=1) +- [Yahoo Bulk Sender Contact Form](http://help.yahoo.com/l/us/yahoo/mail/postmaster/bulkv2.html) +- [Hotmail Deliverability Issue Submission](https://mail.live.com/mail/services.aspx) +- [AOL Whitelisting Process](https://postmaster.aol.com/whitelist-request) -* [AOL](http://rbl.att.net/cgi-bin/rbl/block_admin.cgi) -* [AT&T](http://postmaster.aol.com/SupportRequest.php) -* [Barracuda](http://www.barracudacentral.org/rbl/removal-request) -* [Comcast](http://postmaster.comcast.net/block-removal-request.html) -* [Google](https://support.google.com/mail/contact/msgdelivery) -* [McAfee](https://secure.mcafee.com/apps/mcafee-labs/threat-feedback.aspx) -* [Microsoft/Outlook](https://support.live.com/eform.aspx?productKey=edfsmsbl3&ct=eformts) -* [Mimecast](http://www.mimecast.com/senderfeedback) -* [SpamCop](http://www.spamcop.net/bl.shtml) -* [Spam Rats](http://www.spamrats.com/removal.php) -* [Spamhaus](http://www.spamhaus.org/lookup/) -* [SURBL](http://www.surbl.org/surbl-analysis) -* [Trend Micro](https://ers.trendmicro.com/reputations) -* [URIBL](https://admin.uribl.com/) -* [Yahoo](http://help.yahoo.com/l/us/yahoo/mail/postmaster/bulkv2.html) +{% warning %} +If a listing service ever asks you pay a fee for a delisting request, or if they say that they do not accept delisting requests, then you should not waste your time or money trying to get your domain/IP delisted because these services are rarely, if ever, used by ISPs. +{% endwarning %} diff --git a/source/Glossary/blocks.md b/source/Glossary/blocks.md index 8dc49e99b5..c86b2fe15f 100644 --- a/source/Glossary/blocks.md +++ b/source/Glossary/blocks.md @@ -20,8 +20,7 @@ See the block reason column for more detail specific to the blocked email. ![Blocks]({{root_url}}/images/blocks_1.png) -A few helpful links: +Additional Resources: * [Web API & Blocks]({{root_url}}/API_Reference/Web_API/blocks.html) -* [My Emails are being dropped](https://sendgrid.zendesk.com/hc/en-us/articles/200181708) -* [My Emails are being dropped](https://sendgrid.zendesk.com/hc/en-us/articles/200181728) + diff --git a/source/Glossary/bounces.md b/source/Glossary/bounces.md index 982d2aa6fa..887b43321d 100644 --- a/source/Glossary/bounces.md +++ b/source/Glossary/bounces.md @@ -2,7 +2,7 @@ seo: title: Bounces description: Bounced emails are emails that are returned to the server that sent them. - keywords: blocks, undelivered email + keywords: bounced email, bounces, undelivered email, returned email, rejected email title: Bounces weight: 0 layout: page @@ -23,7 +23,7 @@ You can also [retrieve and edit your list of bounces]({{root_url}}/API_Reference Helpful Knowledge Base articles: {% endanchor %} -* [Drop Reason: Bounced Address](https://sendgrid.zendesk.com/hc/en-us/articles/203790456) -* [Bounce Forwarding APP](https://sendgrid.zendesk.com/hc/en-us/articles/200181478) -* [Implementing Bounce Notification For Multiple From Addresses](https://sendgrid.zendesk.com/hc/en-us/articles/200185178) -* [Email Activity & Bounces](https://sendgrid.zendesk.com/hc/en-us/articles/200181728) +* [Drop Reason: Bounced Address](https://sendgrid.com/docs/Classroom/Track/Drops/drop_reason_bounced_address.html) +* [Bounce Forwarding APP](https://sendgrid.com/docs/Classroom/Track/Bounces/how_to_set_up_bounce_forwarding.html) +* [Implementing Bounce Notification For Multiple From Addresses](https://sendgrid.com/docs/Classroom/Track/Bounces/implementing_bounce_notification_for_multiple_from_addresses.html) +* [Email Activity & Bounces](https://sendgrid.com/docs/User_Guide/email_activity.html) diff --git a/source/Glossary/campaigns.md b/source/Glossary/campaigns.md new file mode 100644 index 0000000000..e51482867a --- /dev/null +++ b/source/Glossary/campaigns.md @@ -0,0 +1,15 @@ +--- +seo: + title: Campaigns + description: Campaigns are used to send custom emails to targeted recipient segments. + keywords: +title: Campaigns +weight: 0 +layout: page +navigation: + show: false +--- + +[Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/index.html) are used to send custom email templates to targeted recipient segments. In utilizing the Marketing Campaigns UI or API, one can create a sender identity, upload contacts, set up unsubscribe groups, edit email templates, and create a campaign to send specifically tailored email to different email group segments and boost your email marketing. + +For more information about Campaigns, please see our [User Guide]({{root_url}}/User_Guide/Marketing_Campaigns/index.html). diff --git a/source/Glossary/categories.md b/source/Glossary/categories.md index b1ac094c6d..8718660706 100644 --- a/source/Glossary/categories.md +++ b/source/Glossary/categories.md @@ -12,7 +12,7 @@ seo: Categories help organize your email analytics by enabling you to tag emails you send by topics you define. -Just as you can view the statistics on all your activity under the '[Statistics]({{root_url}}/User_Guide/Delivery_Metrics/)' tab, you can go a step further and view the [statistics broken down to a particular category]({{root_url}}/User_Guide/Delivery_Metrics/categories.html). +Just as you can view the statistics on all your activity under the '[Statistics]({{root_url}}/User_Guide/Statistics/index.html)' tab, you can go a step further and view the [statistics broken down to a particular category]({{root_url}}/User_Guide/Statistics/categories.html). The events that can be associated with category include: diff --git a/source/Glossary/cname.md b/source/Glossary/cname.md index 96694f08a3..2c26f20433 100644 --- a/source/Glossary/cname.md +++ b/source/Glossary/cname.md @@ -15,9 +15,9 @@ The CNAME record creates an alias for subdomain.yourdomain.com and points to sen What it should look like: {% codeblock %} -subdomain.yourdomain.com. | CNAME | sendgrid.net. +subdomain.yourdomain.com. | CNAME | sendgrid.net. {% endcodeblock %} -If your account has a dedicated IP and you are looking to [whitelabel]({{root_url}}/User_Guide/Setting_Up_Your_Server/Whitelabeling/index.html) your IP, you will need to add some records to your DNS host. In this group of records you will have 1 CNAME record. +If your account has a dedicated IP and you are looking to set up [reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) your IP, you will need to add some records to your DNS host. In this group of records you will have 1 CNAME record. -If you are having trouble validating your CNAME record, please see our [Classroom]({{root_url}}/Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.html). +If you are having trouble validating your CNAME record, please see our [sender authentication troubleshooting]({{root_url}}/User_Guide/Settings/Sender_authentication/Troubleshooting.html). diff --git a/source/Glossary/ctr.md b/source/Glossary/ctr.md index 923bf17a0c..9622c63f6c 100644 --- a/source/Glossary/ctr.md +++ b/source/Glossary/ctr.md @@ -37,7 +37,7 @@ Make sure that the content of your emails is to-the-point and relevant to your s {% anchor h3 %}Sending Frequency{% endanchor %} -Be up front with your recipients regarding your sending rates. If you tell your users that you will send out one newsletter every week, then it's important to to stick to that schedule. Better still, give your recipients options, such as the ability to choose between a weekly and a monthly newsletter. +Be up front with your recipients regarding your sending rates. If you tell your users that you will send out one newsletter every week, then it's important to stick to that schedule. Better still, give your recipients options, such as the ability to choose between a weekly and a monthly newsletter. {% anchor h3 %}Consistency{% endanchor %} diff --git a/source/Glossary/custom_fields.md b/source/Glossary/custom_fields.md new file mode 100644 index 0000000000..0a7e40fd5b --- /dev/null +++ b/source/Glossary/custom_fields.md @@ -0,0 +1,15 @@ +--- +seo: + title: Custom Fields + description: Custom fields allow you add extra information about your contacts to your contact database. + keywords: +title: Custom Fields +weight: 0 +layout: page +navigation: + show: false +--- + +[Custom Fields]({{root_url}}/User_Guide/Marketing_Campaigns/custom_fields.html) allow you add extra information about your contacts to your contact database. With custom fields, you can create custom segments from your individual contacts or from your contact database that will dynamically update your content with the values for the individual contact receiving the email. Your custom fields are completely customizable to the use cases and user information that you need. + +For more information about Custom Fields, please see our [User Guide]({{root_url}}/User_Guide/Marketing_Campaigns/custom_fields.html). diff --git a/source/Glossary/deferrals b/source/Glossary/deferrals deleted file mode 100644 index 210cc8f2b6..0000000000 --- a/source/Glossary/deferrals +++ /dev/null @@ -1,15 +0,0 @@ ---- -seo: - title: Deferral -title: Deferral -weight: 0 -layout: page -navigation: - show: false ---- - -A deferred status can occur when an ISP or mailbox provider is for some reason not ready to accept email from your IP address. Instead of blocking or bouncing the message, the provider will defer or temporarily delay receiving the message and wait for the email to be resent. - -There are several reasons a provider will give this feedback. Some common reasons are that the provider does not recognize the IP from which a message originates; or it could just be that their system is operating in such a way that they cannot accept the email at that specific time. If, upon your resending, the provider determines that it is ready to trust you as a sender or their system operations are back to normal, the email will be accepted. - -SendGrid will retry delivery of a deferred email on behalf of our customers for 72 hours from the time of the first deferral, after which time the email address will be placed on the Bounce Suppressions list. If you have built your own email solution, you will want to build this intelligence into your code in order to avoid having to retry deliveries manually. diff --git a/source/Glossary/deferrals.md b/source/Glossary/deferrals.md index 210cc8f2b6..37d47970d3 100644 --- a/source/Glossary/deferrals.md +++ b/source/Glossary/deferrals.md @@ -12,4 +12,4 @@ A deferred status can occur when an ISP or mailbox provider is for some reason n There are several reasons a provider will give this feedback. Some common reasons are that the provider does not recognize the IP from which a message originates; or it could just be that their system is operating in such a way that they cannot accept the email at that specific time. If, upon your resending, the provider determines that it is ready to trust you as a sender or their system operations are back to normal, the email will be accepted. -SendGrid will retry delivery of a deferred email on behalf of our customers for 72 hours from the time of the first deferral, after which time the email address will be placed on the Bounce Suppressions list. If you have built your own email solution, you will want to build this intelligence into your code in order to avoid having to retry deliveries manually. +SendGrid will retry delivery of a deferred email on behalf of our customers for 72 hours from the time of the first deferral, after which time the email address will be placed on the Block Suppression list. If you have built your own email solution, you will want to build this intelligence into your code in order to avoid having to retry deliveries manually. diff --git a/source/Glossary/deliveries.md b/source/Glossary/deliveries.md index bff86c11ce..394bb74091 100644 --- a/source/Glossary/deliveries.md +++ b/source/Glossary/deliveries.md @@ -1,17 +1,19 @@ --- seo: - title: Deliveries + title: Delivery description: A delivery is recorded when a request to send an email results in the delivery of that email to the end recipient. - keywords: Delivery, email delivery, delivery metrics, email statistics -title: Deliveries + keywords: Delivery, email delivery, statistics, email statistics +title: Delivery weight: 0 layout: page navigation: show: false --- -A delivery is recorded when a request to send an email results in the email being accepted by the receiving server, however this does not necessarily mean that the message reached the recipient’s inbox. Some users and some email applications may filter the email away from the inbox even though the email was delivered to (read: accepted by) the recipient email server. +A delivery is recorded when a request to send an email results in the email being accepted by the receiving server. However, this does not necessarily mean that the message reached the recipient’s inbox. Some users and some email applications may filter the email away from the inbox even though the email was delivered to (read: accepted by) the recipient email server. If an email is indicated as delivered you can be certain that it was not deferred by the ISP. +Related to delivery is deliverability, which is the measurement of email that reaches the inbox. So while an email could be "delivered" (i.e. accepted by the recipient email server), 100% "deliverability" would only be achieved if that email was then delivered to the recipient's inbox. + Visit [Statistics]({{root_url}}/User_Guide/Statistics/index.html) to find more information about all the statistics SendGrid provides. diff --git a/source/Glossary/dkim.md b/source/Glossary/dkim.md index 91f3bc8b9a..a5a6cc6370 100644 --- a/source/Glossary/dkim.md +++ b/source/Glossary/dkim.md @@ -28,9 +28,9 @@ SendGrid automatically enables DKIM for all email to improve your [email deliver Automated Security and Your DKIM Signature {% endanchor %} -When you set up a [whitelabel]({{root_url}}/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.html), you will be given the option of using [automated or manual security]({{root_url}}/Classroom/Deliver/Sender_Authentication/what_is_automated_security_in_the_whitelabel_settings.html). When you select automated security, SendGrid will manage your DKIM and SPF records for you. This means that whenever you make a change to your account that could impact your deliverability, such as adding a new dedicated sending [IP address]({{root_url}}/Glossary/ip_address.html), SendGrid will automatically update your DNS settings and your DKIM signature. +When you set up a [authenticated domain]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html), you will be given the option of using [automated or manual security]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html#-Using-automated-security). When you select automated security, SendGrid will manage your DKIM and SPF records for you. This means that whenever you make a change to your account that could impact your deliverability, such as adding a new dedicated sending [IP address]({{root_url}}/Glossary/ip_address.html), SendGrid will automatically update your DNS settings and your DKIM signature. -**SendGrid will always provide you with a custom DKIM signature. However, your custom DKIM signature is only automatically updated if you select automated security when creating your domain whitelabel. If you turn automated security OFF, you will be responsible for updating your DKIM signature whenever you make a change to your sending domain.** +**SendGrid will always provide you with a custom DKIM signature. However, your custom DKIM signature is only automatically updated if you select automated security when authenticating your domain. If you turn automated security OFF, you will be responsible for updating your DKIM signature whenever you make a change to your sending domain.** @@ -41,8 +41,8 @@ Example DKIM Record: Automated Security ON {% codeblock %} subdomain.yourdomain.com. | CNAME | uXXXXXXX.wlXXX.sendgrid.net -s1.domainkey.yourdomain.com. | CNAME | s1.domainkey.uXXX.wlXXX.sendgrid.net. -s2.domainkey.yourdomain.com. | CNAME | s2.domainkey.uXXX.wlXXX.sendgrid.net. +s1._domainkey.yourdomain.com. | CNAME | s1._domainkey.uXXX.wlXXX.sendgrid.net. +s2._domainkey.yourdomain.com. | CNAME | s2._domainkey.uXXX.wlXXX.sendgrid.net. {% endcodeblock %} diff --git a/source/Glossary/dmarc.md b/source/Glossary/dmarc.md index 5eec748156..b41ea0735c 100644 --- a/source/Glossary/dmarc.md +++ b/source/Glossary/dmarc.md @@ -13,9 +13,112 @@ seo: override: true --- -Domain-based Message Authentication Reporting and Conformance (DMARC) is an additional layer of email authentication that builds on the two previous authentication methods [Sender Policy Framework (SPF)]({{root_url}}/Glossary/spf.html) and [DomainKeys Identified Mail (DKIM)]({{root_url}}/Glossary/dkim.html). First and foremost, both SPF and DKIM must be implemented before a DMARC policy can be put into place. +{% anchor h2 %} +What is DMARC? +{% endanchor %} -DMARC came about in an effort to standardize what happens to your sent mail in the event of failed authentications. Conceptually, it’s helpful to think of DMARC in the context of "if this then that” reasoning. If SPF and DKIM both fail, then DMARC takes action on its defined policy. Both DKIM and SPF must fail before any action on a DMARC policy is taken. This layer of defense provides consistency and defined results to legitimate senders. +Ever received an email message that claimed to be from a company or a brand, and clearly wasn’t? This “phishy” behavior is often the result of domain spoofing, and is likely the work of someone trying to phish personal details of the messages’ recipients. Current email infrastructure standards aren’t perfect, and can sometimes be exploited. So how do you protect your own domain or brand from being spoofed in this way? -Without DMARC, [ESPs]({{root_url}}/Glossary/email_service_provider.html) decide whether to deliver or block mail based on the authentication results of SPF and DKIM. DMARC allows the legitimate senders to tell ESPs who have implemented DMARC exactly what to do with the unauthenticated mail. This becomes absolutely vital for those senders who are concerned with their domain being spoofed. Check out our article on [implementing DMARC]({{root_url}}/Classroom/Basics/Email_Infrastructure/everything_about_dmarc.html) which goes into the specifics of DMARC policies. +Enter DMARC, "Domain-based Message Authentication, Reporting & Conformance". Which was created to tell a participating receiving server what to do with a message that fails both SPF and DKIM validation. In other words, what to do if a message claims to be from you, but isn't. +{% anchor h2 %} +How do I implement DMARC? +{% endanchor %} + +Deploying DMARC for your email systems is a powerful way to help prevent malicious entities from potentially spoofing or otherwise tarnishing your good name. DMARC isn't for everyone, if you own a small domain, you're probably ok without it. If you have ever had problems with phishing in the past, or have a business that is financial oriented in nature, It might be right for you. + +DMARC, in conjunction with a dedicated IP (included in Pro or higher accounts) is a great start to getting industry-supported piece of mind. The DMARC aggregate and forensic reports are designed to be machine readable, and can be difficult for humans to make sense of. You will also need to utilize a DMARC report monitoring service to collect the reports and present the information in a meaningful way that leads to actionable insights. +Return Path's Brand Monitor is one, and Agari is another. + +*To set up DMARC:* + +1. Deploy DKIM & SPF by setting up reverse DNS on your SendGrid IP. +2. Ensure proper DKIM and SPF signing for your authenticated domain. +3. Publish a DMARC record with your DNS registrar, then monitor the results. +4. Analyze the feedback you receive, and adjust your mail streams as needed. +5. Escalate your DMARC policy tags from 'p=none' to 'p=quarantine' to 'p=reject' as you gain experience. + + +## 1. Deploy DKIM & SPF by setting up reverse DNS for you SendGrid IP + +Start by completing reverse DNS for your SendGrid IP. This ensures that emails sent through your SendGrid account will be properly signed using DKIM and SPF for your unique domain. +For more information on reverse DNS, + +## 2. Ensure proper DKIM and SPF signing for your authenticated domain + +Send yourself some test emails if you're unsure of this step. You're looking to verify that the DKIM and SPF signatures in your email headers align to your authenticated domain. ![](https://lh4.googleusercontent.com/kjZ6aO15x8UB3TcHG6X6N3G78rm601i7L6knyLCxw2Ujg4lFNpbG_5DrNK1wHYB6cZ27sIFb87q3rF8wx3xitTJxWQAdtOHqkAlS8CdyoIydj3gKY9w) +As long as both are passing, you’re in business! + +## 3. Publish a DMARC record with your DNS registrar, then monitor the results + +Within your DNS registrar, you'll need to create a TXT resource record that receivers can use to determine your DMARC preferences. This is done within the DNS registrar of the domain host, likely the same place you created the DNS records while authenticating it. This record is made at the root level for the domain, not the subdomain. + +![](https://lh6.googleusercontent.com/d9Cpjrw0_rW_s9KuXTYdfQNISzwOTFTunaDbkHU5frW7se-a3nsEkR2MkTIBGdUF8i6IhOCF88jLF0zGrjajwy2iIxcTdJ6ptxX4avQLsXYeThW_MhI) + + +{% anchor h3 %} +A simple DMARC record +{% endanchor %} + + “v=DMARC1; p=quarantine; pct=100; rua=mailto:dmarc.rua@customddomain.com” + +The record explained: +**v** =DMARC1; - Version - It is set to use DMARC version 1, there are no other versions at present. So always set 1. + +**pct** =100; - Percent - Assess 100% of messages claiming to be from the domain, this can be any number between 1 and 100. + +**p** =quarantine **;** - Policy - Tell receiver to QUARANTINE unqualified mail, which generally means “send this directly to the spam folder”. + +**rua** = [mailto:example@example.com](mailto:postmaster@whitelabeldomain.com) Reporting URI of aggregate reports - Send aggregate reports to dmarc.rua [@customdomain.com](mailto:postmaster@whitelabeldomain.com), set this to an email address you control that is closely monitored. + +Note: This example uses the p=quarantine policy, but always start out using the p=none policy at first. + +### Policies + +This is where the magic happens. The policy you select in your DMARC record will tell the participating recipient mail server what to do with mail that doesn’t pass SPF and DKIM, but claims to be from your domain that contains the DMARC record. There are 3 records you can set: p=none, p=quarantine, and p=reject. + +**p=none** - Tell the receiver to perform no actions against unqualified mail, but still send email reports to the mailto: in the DMARC record for any infractions. + +**p=quarantine** - Tell receiver to quarantine unqualified mail, which generally means “send this directly to the spam folder”. + +**p=reject** - Tell the receiver to completely deny any unqualified mail for the domain. With this enabled, only mail that is verified as 100% being signed by your domain will even have a chance at the inbox. Any mail that does not pass is blackholed, not bounced, so there’s no way to catch false positives. + +## 4. Analyze the feedback you receive and adjust your mail streams as needed + +If unqualified mail gets sent to, and received by, recipients participating in DMARC, the recipient will generate reports for these messages and send them back to the mailto: address specified in your DMARC record. These reports will give you the information required to help you evaluate and tune your mail streams with the end goal of determining exactly what services might be sending mail on behalf of your domain. + +Here is a sample report with only one record, showing the results for 2 pieces of mail. +Please note that the listed SPF and DKIM auth\_results are raw results, regardless of the s= alignment. +The filename is formatted as: filename = receiver "!" policy-domain "!" begin-timestamp "!" end-timestamp "." extension + +Example: receiver.org!sender.com!1335571200!1335657599.zip + +      receiver.com    noreply-dmarc-support@receiver.com    http://receiver.com/dmarc/support    9391651994964116463          1335571200      1335657599            sender.com    r    r    

none

   none    100  
           72.150.241.94      2              none        fail        pass                    sender.com                      sender.com        fail                            sender.net        pass                            sender.com        pass            
+ +\*Note: Aggregate reports are sent as a .zip attachment, so be sure the address you’re defining is able to accept attachments in this file type. + +## 5. Escalate your DMARC policy tags from p=none to p=quarantine to p=reject as you gain experience + +Now that you’ve tested and tweaked your mail streams to determine exactly who and what is sending mail for your domain, it’s time to turn it up a notch. + +Up until now you should have only been using the p=none policy to get reports of any errant behavior, and you should have a good idea of where email is coming from. The next step is to adjust the policy on your DMARC record to start controlling how receivers handle mail claiming to be from your domain. + +**p=none** - Get reports of infractions, but no action is taken by recipients as far as processing the messages themselves. + +**p=quarantine** - Unqualified mail goes directly to spam, but can be recovered. This is useful when you’re fairly certain you know all the locations where mail is coming from, but want to ‘softfail’ any messages that are unqualified until you’re 100% sure. + +**p=reject** - When you’re absolutely sure you know every server and service that is sending email for your domain, signing is in place for each of these services and you want anything with the audacity to claim otherwise completely denied. Unqualified mail is completely deleted by the recipient mail server, never to be seen again. + +{% anchor h2 %} +Additional resources +{% endanchor %} + +- Frequently Asked Questions: [http://dmarc.org/faq.html](http://dmarc.org/faq.html) +- DMARK Specification: [http://dmarc.org/specification.html](http://dmarc.org/specification.html) +- SendGrid Blog Post: [http://sendgrid.com/blog/what-is-dmarc-and-why-should-you-care/](http://sendgrid.com/blog/what-is-dmarc-and-why-should-you-care/) +- SPF Syntax: [http://www.openspf.org/SPF\_Record\_Syntax](http://www.openspf.org/SPF_Record_Syntax) + +- Returnpath: [http://www.returnpath.com/solution-content/dmarc-support/](http://www.returnpath.com/solution-content/dmarc-support/ +- Agari: [http://agari.com/dmarc/](http://www.openspf.org/SPF_Record_Syntax) +- SPF record validator: [http://www.kitterman.com/spf/validate.html](http://www.kitterman.com/spf/validate.html) +- DMARC record validator: [http://kitterman.com/dmarc/assistant.html](http://kitterman.com/dmarc/assistant.html) diff --git a/source/Glossary/domain.md b/source/Glossary/domain.md index 627c8d8f2a..b9a156d177 100644 --- a/source/Glossary/domain.md +++ b/source/Glossary/domain.md @@ -12,7 +12,7 @@ navigation: A domain is a named Internet address that resolves to the numbered Internet Protocol (IP) addresses computers use to connect. Examples: sendgrid.com, yourdomain.com, google.com. Simply put, it’s the web address your users type into their browser to learn about your company. -If you are on a Pro 100k or above plan you will have your very own dedicated IP address which we encourage you to [whitelabel your server for sending with SendGrid]({{root_url}}/User_Guide/Setting_Up_Your_Server/Whitelabeling/index.html) +If you are on a Pro 100k or above plan you will have your very own dedicated IP address which we encourage you to [set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) {% anchor h2 %} SMTP Domain diff --git a/source/Glossary/domain_authentication.md b/source/Glossary/domain_authentication.md new file mode 100644 index 0000000000..b3e068544b --- /dev/null +++ b/source/Glossary/domain_authentication.md @@ -0,0 +1,25 @@ +--- +seo: + title: Domain authentication +title: Domain authentication +weight: 0 +layout: page +navigation: + show: false +--- + +Domain authentication shows email providers that SendGrid has your permission to send emails on your behalf. To give SendGrid permission, you point DNS entries from your DNS provider (like GoDaddy, Rackspace, or Cloudflare) to SendGrid. Your recipients will no longer see the “via sendgrid.net” message on your emails. + +Even though this is a small change from your recipients' perspective, this change has a huge positive impact on your reputation as a sender and your email deliverability. Email service providers distrust messages that don't have domain authentication set up because they can not be sure that the message comes from you. Explicitly stating that it comes from you increases your reputation with email service providers which makes it much less likely that they will filter your mail and not allow it get to your recipient's inbox, which increases your deliverability. You are also explicitly showing your recipients that this email comes from you, so they are less likely to mark your mail as spam. + +{% info %} +In an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS. +{% endinfo %} + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [How to set up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) +- [How to set up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) +- [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) \ No newline at end of file diff --git a/source/Glossary/drops.md b/source/Glossary/drops.md index 53361728ba..8a57a700ed 100644 --- a/source/Glossary/drops.md +++ b/source/Glossary/drops.md @@ -8,10 +8,14 @@ navigation: show: false --- -A drop occurs when our systems identify that a message is sent to an email address that is already listed on one of the suppression lists: Bounces, Unsubscribes, Spam reports and Invalid Emails. If an email is already on one of the lists mentioned above, our systems automatically drop the email in order to protect your Sender Reputation. +In certain cases, SendGrid will “Drop” a message to a specific email address in order to protect your sender reputation. SendGrid keeps Email Lists to track bounces, spam reports, and unsubscribes for each of our users. If a user sends a message to an email address that exists on one of these lists within their account, SendGrid will automatically drop the message (i.e., not send to the address). + +{% info %} +SendGrid users can always delete entries from these lists if an email address is erroneously placed on one or more of them. Users can accomplish this by mousing over the entry for an address and clicking the “Delete” button. +{% endinfo %} {% anchor h2 %} -How to identify Drops +Identifying Drops {% endanchor %} On the [Global Stats Dashboard]({{root_url}}/User_Guide/Statistics/global.html), the Drops can also be identified as Repeated Bounces, Repeated Spam Reports, Repeated Unsubscribes and Invalid Emails: @@ -19,14 +23,14 @@ On the [Global Stats Dashboard]({{root_url}}/User_Guide/Statistics/global.html), You will also find drops in your [Email Activity]({{site.app_url}}/email_activity). Clicking on the event, will show more details about it, including the reason for which the email was dropped. {% info %} -If the email address is on the Unsubscribe list the reason will say "Unsubscribed Address"; if on the Spam report list, it will say "Spam Reporting Address" and if on the Invalid Emails list, it will say "Invalid".* +If the email address is on the Unsubscribe list the reason will say "Unsubscribed Address"; if on the Spam report list, it will say "Spam Reporting Address" and if on the Invalid Emails list, it will say "Invalid". {% endinfo %} {% anchor h2 %} -Some other reasons for which SendGrid may drop emails are: +Other reasons for dropped emails: {% endanchor %} -1. Email triggers SendGrid's spam filters. You can identify these drops only through the data received through the [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html) or in Email Activity. In both cases, the reason displayed will say "Spam Content". +1. Email triggers SendGrid's spam filters if you have the [Spam Checker filter]({{root_url}}/User_Guide/Settings/mail.html#-Spam-Checker) enabled. You can identify these drops only through the data received through the [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html) or in [Email Activity]({{root_url}}/User_Guide/email_activity_feed.html). In both cases, the reason displayed will say "Spam Content". 2. The SMTPAPI header is built incorrectly - this will cause the emails to be dropped with the reason "Invalid SMTPAPI header". For more details about how to build the SMTPAPI header, please view our documentation on [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html). @@ -36,21 +40,19 @@ Some other reasons for which SendGrid may drop emails are: How to remove Drops {% endanchor %} -If you would like us to attempt to deliver messages to a specific address again, please delete that address from the suppression list. You can visit your suppression lists and removing an address from the bounces list. Then you will be able to send future messages without us intervening on your behalf; you're essentially telling us that this address should be fine, but something went wrong and you'd like to try again. +If you would like us to attempt to deliver messages to a specific address again, please delete that address from the suppression list. On the suppression list page, you can remove an address from the bounces list. Then you will be able to send future messages without us intervening on your behalf; you're essentially telling us that this address should be fine, but something went wrong and you'd like to try again. {% info %} -NOTE: We cannot re-deliver messages that have been Dropped or appear on suppression lists, but we will attempt future messages once the address has been removed from the list. +NOTE: SendGrid cannot re-send messages that have been Dropped or appear on suppression lists, but will attempt future deliveries once the address has been removed from the list and is sent to again. {% endinfo %} -*Since SendGrid’s got my back and my reputation is not affected by these Drops, why should I care about removing them?* +*Since SendGrid has my back, and my reputation is not affected by these Drops, why should I care about removing them?* -Your lists will be cleaner and even if we do drop the messages intended to addresses that are already on one of the suppression lists, we do accept and process these requests before we drop them. Since this is the case, you are still charged for these emails. +Your lists will be cleaner and even if we do drop the messages intended to addresses that are already on one of the suppression lists, we do accept and process these requests before we drop them. Since this is the case, dropped emails will still count towards your monthly plan email limit. {% anchor h3 %} -Clean your lists +Cleaning your lists {% endanchor %} -You can easily clean your lists from all the bad email addresses in 2 simple ways: +We recommend Using the [Web API]({{root_url}}/API_Reference/Web_API/index.html) to export any of the suppression lists. Once you export that data, you can use it to clean your distribution lists. -1. Using our tool called [List Assist]({{root_url}}/Utilities/list_assist.html). It is super easy to use and removes the unwanted email addresses in just a few seconds. Here is a short [video tutorial]({{root_url}}/VidGrid/Tools/listassist.html) on how to use the tool. -2. Using the [Web API]({{root_url}}/API_Reference/Web_API/index.html) to export any of the suppression lists. Once you export that data, you can use it to clean your distribution lists. diff --git a/source/Glossary/email_api_integration.md b/source/Glossary/email_api_integration.md index b01e0c7817..03adfca95a 100644 --- a/source/Glossary/email_api_integration.md +++ b/source/Glossary/email_api_integration.md @@ -25,4 +25,4 @@ SendGrid provides a series of flexible web and SMTP APIs for easy email API inte * [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html) – Allows users to specify custom-handling instructions for their email through a header inserted into the body of the message. The header can be added to any SMTP message sent to SendGrid. * [Web API]({{root_url}}/API_Reference/Web_API/index.html) – Allows SendGrid customers to retrieve information and statistics about their account, including spam reports, bounces, and unsubscribes. -All APIs are fully documented and many provide examples for you to test even the most complex email API integration scenarios. Moreover, our systems are set up to process thousands of requests each minute ensuring that you can power your app with the greatest speed and reliability. Bring your platform to the next level by integrating with SendGrid. \ No newline at end of file +All APIs are fully documented and many provide examples for you to test even the most complex email API integration scenarios. Moreover, our systems are set up to process thousands of requests each minute ensuring that you can power your app with the greatest speed and reliability. Bring your platform to the next level by integrating with SendGrid. diff --git a/source/Glossary/email_harvesting.md b/source/Glossary/email_harvesting.md index a7f2ecdd18..73db11ba16 100644 --- a/source/Glossary/email_harvesting.md +++ b/source/Glossary/email_harvesting.md @@ -13,8 +13,8 @@ navigation: Email harvesting is the process of obtaining lists, either by purchase or theft, of valid email addresses for the purpose of sending bulk email or spam, or in malicious instances, phishing attempts. -Spammers may use bots to find valid email addresses on the Internet by spidering web pages. The CAN-SPAM Act of 2003 made it illegal to harvest email addresses via these automated means, and to sell or give away lists of recipients gathered for legitimate purposes. +Spammers may use bots to find valid email addresses on the Internet by spidering web pages. The CAN-SPAM Act of 2003 made it illegal to harvest email addresses via these automated means, and to sell or give away lists of recipients gathered for legitimate purposes. -The email addresses of your customers are valuable, so SendGrid takes the security of your send lists very seriously. +The email addresses of your customers are valuable, so SendGrid takes the security of your send lists very seriously. For tips on getting your messages to the Inbox, please see our [email deliverability page]({{root_url}}/Classroom/Deliver/index.html). diff --git a/source/Glossary/email_marketing.md b/source/Glossary/email_marketing.md index 2989d2b517..1bec5637e2 100644 --- a/source/Glossary/email_marketing.md +++ b/source/Glossary/email_marketing.md @@ -32,6 +32,6 @@ SendGrid can help you achieve your email marketing goals with our [Marketing Ema * [Scheduled Marketing campaigns delivery]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.html) * [Powerful analytics]({{root_url}}/User_Guide/Statistics/index.html) * [A/B testing]({{root_url}}/User_Guide/Marketing_Campaigns/a_b_testing.html) -* [List Segmentation]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html) +* [List Segmentation]({{root_url}}/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.html) This level of visibility into your email marketing performance is invaluable when it comes to determining what resonates best with your audience. Overall, the key to a successful email marketing is that it drives an action. You should strive to provide relevant content by using segmentation strategies to tailor your communications. This is best achieved by testing your design, content, and offers to determine what resonates best with your subscribers. diff --git a/source/Glossary/email_service_provider.md b/source/Glossary/email_service_provider.md index e2237f7efd..9d0234559d 100644 --- a/source/Glossary/email_service_provider.md +++ b/source/Glossary/email_service_provider.md @@ -20,10 +20,10 @@ Most ESPs include features that allow customers to: * Improve email deliverability * Monitor statistics of your email campaigns -ESPs like SendGrid also provide expertise on increasing your [email deliverability]({{root_url}}/Glossary/email_deliverability.html), preserving your sending reputation. They may utilize features and tools to accomplish this, such as: +ESPs like SendGrid also provide expertise on increasing your [email deliverability]({{root_url}}/Glossary/email_deliverability.html), preserving your sending reputation. They may utilize features and tools to accomplish this, such as: * [IP Whitelabeling]({{root_url}}/Glossary/ip_whitelabeling.html) * [Dedicated IPs]({{root_url}}/API_Reference/Web_API_v3/IP_Management/index.html) * [IP warming]({{root_url}}/Classroom/Deliver/warming_up_ips.html) -An ESP may provide email services via a user interface (UI), or may also be an [SMTP provider]({{root_url}}/Glossary/smtp_provider.html). SendGrid provides both services. +An ESP may provide email services via a user interface (UI), or may also be an [SMTP provider]({{root_url}}/Glossary/smtp_provider.html). SendGrid provides both services. diff --git a/source/Glossary/expired.md b/source/Glossary/expired.md new file mode 100644 index 0000000000..56eecd5b13 --- /dev/null +++ b/source/Glossary/expired.md @@ -0,0 +1,31 @@ +--- +seo: + title: Expired + description: Bounced - Expired emails are emails that are unable to be delivered within 72 hours. + keywords: expired, bounce, undelivered email +title: Expired +weight: 0 +layout: page +navigation: + show: false +--- + +If an email bounces, we will retry for up to 72 hours. If the email is unable to be delivered within the last 72 hours, it will expire and be marked as Bounced - Expired. + +Bounced emails are commonly due to SMTP 4.X.X errors or SMTP 5.X.X errors, which cause an email to be undeliverable: + +* An expired, inactive, or disabled recipient address +* The recipient's mailbox has exceeded it's limit +* An incorrect receipient email address +* Domain frequency limited +* Connection frequency limited +* IP frequency limited +* Too many invalid recipients + +{% anchor h3 %} +Additional Resources +{% endanchor %} + +* [Bounces]({{root_url}}/Glossary/bounces.html) +* [Retrieve and Edit your List of Bounces]({{root_url}}/API_Reference/Web_API/bounces.html) +* [Email Activity & Bounces](https://sendgrid.com/docs/User_Guide/email_activity.html) diff --git a/source/Glossary/index.html b/source/Glossary/index.html index a52dbf9e49..96d0d4bfa2 100644 --- a/source/Glossary/index.html +++ b/source/Glossary/index.html @@ -47,6 +47,7 @@
{% anchor h2 %}C{% endanchor %} + Campaigns CAN-SPAM Categories Challenge Response @@ -54,6 +55,7 @@ CNAME Complaint CTR + Custom Fields
{% anchor h2 %}D{% endanchor %} @@ -63,6 +65,7 @@ DMARC DNS Domain + Domain Authentication Drip Campaign Drops
@@ -75,6 +78,7 @@ Email Marketing Email Service Provider Event Webhook + Expired
@@ -87,13 +91,19 @@ Header
- {% anchor h2 %}I{% endanchor %} + {% anchor h2 %}I{% endanchor %} IMAP + Invalid Email IP Address IP Warmup
+
+ {% anchor h2 %}L{% endanchor %} + Link branding + Lists +
{% anchor h2 %}M{% endanchor %} Mail Merge @@ -106,15 +116,14 @@ Open Rate Open Relay Opens - Opt-In Email
+
+
{% anchor h2 %}P{% endanchor %} Peer Initiated Invitation Campaign Phishing
-
- +
{% anchor h2 %}T{% endanchor %} Teammates @@ -153,16 +170,22 @@ Triggered Email Two Factor Authentication
-
-
{% anchor h2 %}U{% endanchor %} Undelivered Email + Unknown User
{% anchor h2 %}W{% endanchor %} Web API White Hat Sender + Whitelabel Whitelist
+
+
+ {% anchor h2 %}X{% endanchor %} + X-Message-ID +
+
\ No newline at end of file diff --git a/source/Glossary/invalid_email.md b/source/Glossary/invalid_email.md new file mode 100644 index 0000000000..c076926359 --- /dev/null +++ b/source/Glossary/invalid_email.md @@ -0,0 +1,13 @@ +--- +layout: page +weight: 0 +title: Invalid Email +navigation: + show: false +seo: + title: Invalid Email + override: true + description: +--- + +An invalid email occurs when you attempt to send email to an address that is formatted in a manner that does not meet internet email format standards. Examples include addresses without the “@” sign or addresses that include certain special characters and/or spaces. This response comes from our own server since an invalid email is impossible to even attempt to send to its [non-existent] destination. diff --git a/source/Glossary/ip_address.md b/source/Glossary/ip_address.md index afb0413061..b59d084822 100644 --- a/source/Glossary/ip_address.md +++ b/source/Glossary/ip_address.md @@ -10,9 +10,7 @@ navigation: show: false --- -An Internet Protocol (IP) Address address is a unique numerical address that defines and internet location. In the more familiar, and recognizable, 4th version these addresses are written as 4 sets of numbers separated by periods. For example, 127.0.0.1 is an IP address. An IP address can be dynamic, meaning it changes each time an email message is deployed, or it can be static meaning it does not change. A static IP address is recommended for senders of commercial email. - -In the context of deploying email, a single IP address or IP range may be dedicated to an organization in order to send email for multiple domains. The reputation of this IP is based on the aggregate performance of all the senders who use it. +An Internet Protocol (IP) Address is a unique numerical address that defines an internet location. These addresses have 4 sets of numbers separated by periods. For example, 127.0.0.1 is an IP address. At SendGrid, you can be on a shared IP address, or you can have a dedicated IP address. We recommend a dedicated IP address for people sending high volumes of email or for people who want control over the quality of mail sent on the same IP as theirs. The aggregate performance of all the senders who use the IP determines its reputation. {% info %} If you are on a Pro 100k or above plan you can see your IP reputation and IP address on your Account Overview page. @@ -20,5 +18,5 @@ If you are on a Pro 100k or above plan you can see your IP reputation and IP add For more information: -* [SendGrid Email Infrastructure Guide.](https://go.sendgrid.com/SendGrid-Infrastructure-Guide.html?mc=Direct&mcd=https://sendgrid.com/docs/index.html) +* [SendGrid Email Infrastructure Guide](https://go.sendgrid.com/SendGrid-Infrastructure-Guide.html?mc=Direct&mcd=https://sendgrid.com/docs/index.html) * [Whitelabeling your IP]({{root_url}}/User_Guide/Setting_Up_Your_Server/Whitelabeling/index.html) diff --git a/source/Glossary/ip_warmup.md b/source/Glossary/ip_warmup.md index f06f70fe43..293d16b0e3 100644 --- a/source/Glossary/ip_warmup.md +++ b/source/Glossary/ip_warmup.md @@ -5,23 +5,26 @@ title: IP Warmup navigation: show: false seo: - title: Warming up and IP + title: IP Warmup override: true description: Initially splitting up the email send requests from a new dedicated IP, so it doesn't get blocked. + keywords: IP, warm, up, warmup, ramp, ramping --- -[IP warming]({{root_url}}/Classroom/Deliver/warming_up_ips.html) is the gradual process of establishing a reputation as a legitimate email sender in the eyes of ISPs (Internet Service Providers). When an ISP observes email suddenly coming from a new or “cold” (recently dormant) IP address, they will take notice and immediately begin evaluating the traffic coming from that IP. +IP warming is the gradual process of establishing a reputation as a legitimate email sender in the eyes of ISPs (Internet Service Providers). When an ISP observes email suddenly coming from a new or “cold” (recently dormant) IP address, they will take notice and immediately begin evaluating the traffic coming from that IP. -Since ISP spam filters look at volume as a significant factor when determining whether or not you are sending spam, we recommend that you begin sending a low to moderate volume (e.g. up to 1 million emails/month), eventually working your way up to larger volumes (e.g. over 1 million emails/month). This gives the receiving email providers a chance to closely observe your sending habits and the way your customers treat the emails they receive from you. +[IP warming]({{root_url}}/User_Guide/Settings/ip_warmup.html) is the gradual process of establishing a reputation as a legitimate email sender in the eyes of ISPs (Internet Service Providers). When an ISP observes email suddenly coming from a new or “cold” (recently dormant) IP address, they will take notice and immediately begin evaluating the traffic coming from that IP. + +ISP spam filters look at volume as a significant factor when determining whether or not you are sending spam. Because of this, we recommend that you begin sending a low to moderate volume ( up to 1 million emails/month), eventually working your way up to larger volumes (over 1 million emails/month). This gives the receiving email providers a chance to closely observe your sending habits and the way your customers treat the emails they receive from you. {% info %} You can now warmup your IP using our [IP Warmup API]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup.html). {% endinfo %} -When you place your IP in warmup mode, we divide your email requests between the dedicated IP you wish to warm up and and any other warm dedicated IPs currently assigned. Each day we will increase the amount sent directly from you warming dedicated IP. You can see the IP warmup schedule [here]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.html). +When you place your IP in warmup mode, we divide your email requests between the dedicated IP you wish to warm up and any other warm, dedicated IPs currently assigned. Each day we will increase the amount sent directly from your warming dedicated IP. You can see the suggested [IP Warmup Schedule]({{root_url}}/assets/IPWarmupSchedule.pdf). {% warning %} -We recommend the IP warmup tool only for users that have other warm, dedicated IPs which can accept any overflow email traffic as we gradually increase the volume sent through the warming IP. +We recommend the IP warmup tool only for users that have other warm, dedicated IPs which can accept any overflow email traffic as we gradually increase the volume sent through the warming IP. -If you do not have other dedicated IPs and are buliding your reputation from scratch, recommend that you follow [this]({{root_url}}/assets/IPWarmupSchedule.pdf) warm up schedule. +If you do not have other dedicated IPs and are building your reputation from scratch, recommend that you follow [this]({{root_url}}/assets/IPWarmupSchedule.pdf) warm-up schedule. {% endwarning %} diff --git a/source/Glossary/link_branding.md b/source/Glossary/link_branding.md new file mode 100644 index 0000000000..183798302f --- /dev/null +++ b/source/Glossary/link_branding.md @@ -0,0 +1,23 @@ +--- +seo: + title: Link branding +title: Link branding +weight: 0 +layout: page +navigation: + show: false +--- + +Email link branding allows all of the click-tracked links and opens tracked images in your emails to be from your domain instead of from sendgrid.net. Spam filters and recipient servers look at the links within emails to determine whether the email looks trustworthy enough to deliver - they use the reputation of the root domain to determine whether the links can be trusted. Implementing link labeling helps in email deliverability because you are no longer relying on click tracking going through a domain that you do not control. + +{% info %} +In an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS. +{% endinfo %} + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [How to set up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) +- [How to set up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) +- [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) \ No newline at end of file diff --git a/source/Glossary/lists.md b/source/Glossary/lists.md new file mode 100644 index 0000000000..90c25c172d --- /dev/null +++ b/source/Glossary/lists.md @@ -0,0 +1,15 @@ +--- +seo: + title: Lists + description: Lists are simply static collections of Marketing Campaigns contacts. + keywords: +title: Lists +weight: 0 +layout: page +navigation: + show: false +--- + +Lists are static collections of Marketing Campaigns contacts. By default, the ALL CONTACTS section stores any new contacts you add. You may create new lists when adding contacts either manually, or when uploading a CSV (comma separated values) file. When you send an email campaign, you can add contact lists to the specific recipient segments you wish to target. + +For more information about Lists, please see our [Building your contact lists]({{root_url}}/User_Guide/Marketing_Campaigns/Managing_Contacts/building_your_contact_list.html). diff --git a/source/Glossary/mailbox_provider.md b/source/Glossary/mailbox_provider.md new file mode 100644 index 0000000000..f5e28ffd2d --- /dev/null +++ b/source/Glossary/mailbox_provider.md @@ -0,0 +1,15 @@ +--- +seo: + title: Mailbox Provider + description: An email service provider provides transactional and marketing email services. + keywords: Mailbox Provider, Email service provider, ESP +title: Mailbox Provider +weight: 0 +layout: page +navigation: + show: false +--- + +A mailbox provider, mail service provider or Email Service Provider (ESP) is a service organization that provides transactional and/or marketing email services. + +More info here: [Email Service Provider (ESP)](https://sendgrid.com/docs/Glossary/email_service_provider.html) diff --git a/source/Glossary/message_id.md b/source/Glossary/message_id.md index 838c59ca99..31a59f7691 100644 --- a/source/Glossary/message_id.md +++ b/source/Glossary/message_id.md @@ -7,9 +7,8 @@ navigation: seo: title: Message-ID override: true - description: Message-ID is a globally unique identifier for email messages. + description: Message-ID is a globally unique identifier for email messages. --- -Message-ID, sometimes shortened to msgid, is a unique identifier assigned to individual email messages by the email server responsible for sending the message. -SendGrid will create a Message-ID for each individual message you send through our systems, with the exception of email sent using direct SMTP integration. This Message-ID information can be viewed in certain events in the SendGrid Activity Feed as well as Event Webhook POST data. +Message-ID, is a unique identifier assigned to individual email messages by the email server responsible for sending the message. SendGrid will create a Message-ID for each individual message you send through our systems. This Message-ID information can be viewed in certain events in the SendGrid Activity Feed as well as Event Webhook POST data. The Activity Feed references the Message-ID as "msgid" and the Event Webhook references it with "sg_message_id". -Example SendGrid Message-ID: **Message-ID: <9aOFU_fzTWeU_5rWZUNWVw@ismtpd0006p1iad1.sendgrid.net>** +Example SendGrid Message-ID: **Message-ID: XBg2anf2TqCy6WXKQFhieQ.filter0905p1mdw1-4434-59E0C6FF-3.0** diff --git a/source/Glossary/openrelay.md b/source/Glossary/openrelay.md index 9d16f6fd92..e6edc6b4c9 100644 --- a/source/Glossary/openrelay.md +++ b/source/Glossary/openrelay.md @@ -6,7 +6,7 @@ navigation: show: false seo: title: Open SMTP Relay - decription: An SMTP server configured in such a way that it allows anyone on the Internet to send email through it. + description: An SMTP server configured in such a way that it allows anyone on the Internet to send email through it. --- An SMTP server configured in such a way that it allows anyone on the Internet to send email through it, not just mail destined for or originating from known users. This is not a recommended configuration because it can be exploited by spammers. Servers with open relays are routinely blocked and/or blacklisted. diff --git a/source/Glossary/opt_in_email.md b/source/Glossary/opt_in_email.md deleted file mode 100644 index c574fdb71c..0000000000 --- a/source/Glossary/opt_in_email.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -seo: - title: Opt-In Email - description: Obtaining permission to send recipients email. - keywords: opt-in, opt-out, bulk email, CAN-SPAM -title: Opt-In Email -weight: 0 -layout: page -navigation: - show: false ---- - -**Opt-in email** refers to bulk email, such as a newsletter or advertisement, that is sent out to a mailing list where every member of that list has actively given you permission to send them email. Without obtaining this permission, your email is likely unwanted or unsolicited, and is liable to be marked as [spam]({{root_url}}/Glossary/spam.html) by the recipient or be “bulked” by the receiving mailbox provider (i.e. delivered directly to the spam folder). - -There are several variations of opt-in email: - -- **Single Opt-in** refers to the practice of requesting your recipient’s permission to send them email during, and only during, registration. - -- **Double Opt-in** refers to the practice of requesting your recipient's permission to send them email twice. For example, you could ask them if they want to receive your email at registration, and then send another email asking them to confirm their permission again. - -- **Confirmed Opt-in** refers to the practice of sending confirmation emails to your recipients asking them to confirm their continued interest in receiving your future emails. - -Giving your recipients the option to opt-in to receive your email will help to improve your [sender reputation]({{root_url}}/Classroom/Basics/Misc/your_reputation_what_is_it.html) and will prevent your emails from ending up in your recipients’ [spam folders]({{root_url}}/Glossary/bulk_mail_folder.html). - -Regardless of your method of obtaining a recipient's permission, it is important to give them the option of **opting-out** of receiving your future emails by including an [unsubscribe link]({{root_url}}/User_Guide/Suppressions/index.html). - -{% info %} -[CAN-SPAM]({{root_url}}/Glossary/can_spam.html) requires an opt-out option in all commercial emails, but it’s good practice to provide it in any email to your recipients. CAN-SPAM requires all senders to immediately honor an opt-out request submitted by a recipient. -{% endinfo %} diff --git a/source/Glossary/phishing.md b/source/Glossary/phishing.md index 0efb2c294f..6aa2f6bb8a 100644 --- a/source/Glossary/phishing.md +++ b/source/Glossary/phishing.md @@ -10,7 +10,7 @@ navigation: show: false --- -Phishing is a technique for acquiring information such as user names, passwords, credit cards, social security numbers and other personal data by masquerading as a trusted business like a bank or credit card company. With phishing messages, the email appears to be sent by the trusted entity and the consumer is tricked into providing their personal information. +Phishing is a technique for acquiring information such as user names, passwords, credit cards, social security numbers or other personal data by masquerading as a trusted entity like a bank or credit card company. Phishing emails appear to be sent by the trusted entity, which can cause the consumer to be tricked into providing their personal information. SendGrid employs both technology and staff to prevent the sending of phishing emails. We have a solid track record of working with the global email community to detect and stop the sending of phishing and spam emails. diff --git a/source/Glossary/preheader.md b/source/Glossary/preheader.md new file mode 100644 index 0000000000..6f35d454d3 --- /dev/null +++ b/source/Glossary/preheader.md @@ -0,0 +1,20 @@ +--- +seo: + title: Preheader + description: A preheader is the short summary text that follows the subject line when an email is viewed in the inbox. Many mobile, desktop and web email clients provide them to tip you off on what the email contains before you open it. + keywords: Preheader, Preheaders, Johnson Box +title: Preheader +weight: 0 +layout: page +navigation: + show: false +--- + +A preheader is the short summary text that follows the subject line when an email is viewed in the inbox. Many mobile, desktop and web email clients provide them to tip you off on what the email contains before you open it. + +Along with the subject line, the preheader text is the first thing subscribers come into contact with when they receive your email campaign. + +Many businesses use preheaders in their email marketing campaigns to get more subscribers to open and read their emails – and to ensure that their campaigns are as deliverable as possible. + +It’s these two elements that they use to decide whether or not to open your campaign, and without getting your email opened it’s impossible to get people to click-through and take your desired conversion action (like making a purchase on your website for instance). + diff --git a/source/Glossary/request.md b/source/Glossary/request.md index e0fb623784..cfccffb053 100644 --- a/source/Glossary/request.md +++ b/source/Glossary/request.md @@ -2,7 +2,7 @@ seo: title: Request description: A request is recorded every time an application attempts to send an email through SendGrid's servers. - keywords: request, delivery metrics, statistics + keywords: request, statistics title: Request weight: 0 layout: page diff --git a/source/Glossary/reseller_email_account.md b/source/Glossary/reseller_email_account.md index a71f5c901a..75a6cadb35 100644 --- a/source/Glossary/reseller_email_account.md +++ b/source/Glossary/reseller_email_account.md @@ -10,6 +10,6 @@ navigation: show: false --- -Having a Reseller Email account means SendGrid has a formal reseller partnership with a company and all billing and usage is integrated into SendGrid. This usually means a platform is reselling SendGrid’s product under their own platform. +Having a Reseller Email account means SendGrid has a formal reseller partnership with a company and all billing and usage is integrated into SendGrid. This usually means a platform is reselling SendGrid’s product under their own platform. SendGrid makes it easy to manage your customers via our [Reseller API]({{root_url}}/API_Reference/Web_API/Reseller_API/index.html). diff --git a/source/Glossary/reserved_fields.md b/source/Glossary/reserved_fields.md new file mode 100644 index 0000000000..480e5cf97d --- /dev/null +++ b/source/Glossary/reserved_fields.md @@ -0,0 +1,15 @@ +--- +seo: + title: Reserved Fields + description: Reserved fields are those custom fields that cannot be deleted and do not count towards your allotment of 60 custom fields. They include fields such as email, first_name, and last_name in Marketing Campaigns. + keywords: +title: Reserved Fields +weight: 0 +layout: page +navigation: + show: false +--- + +[Reserved Fields]({{root_url}}/Classroom/Basics/Marketing_Campaigns/contact_fields.html) are those custom fields that cannot be deleted and do not count towards your allotment of 60 custom fields. They include fields such as **email**, **first_name**, and **last_name** in Marketing Campaigns. + +For more information about Reserved Fields, please see our [Classroom]({{root_url}}/Classroom/Basics/Marketing_Campaigns/contact_fields.html). diff --git a/source/Glossary/reverse_dns.md b/source/Glossary/reverse_dns.md index 2de10c6c2b..cd9865d06a 100644 --- a/source/Glossary/reverse_dns.md +++ b/source/Glossary/reverse_dns.md @@ -10,6 +10,16 @@ navigation: show: false --- -Reverse DNS (rDNS) is a method of resolving an IP address into a [domain name]({{root_url}}/Glossary/domain.html), just as the domain name system (DNS) resolves domain names into associated IP addresses. One of the applications of reverse DNS is as a spam filter. +Setting up reverse DNS on IP addresses allows mailbox providers to verify the sender when they do a reverse DNS lookup upon receipt of the emails you send. When you update your DNS provider with a DNS record provided by SendGrid, and then send mail over your IP, the recipient's email service provider performs a reverse DNS lookup (rDNS) using an A Record (address record). An A Record maps your domain to your IP address. When a mailbox provider looks up your A Record, they see your SendGrid IP address. When they look at your IP address, they see the rDNS that match your A Record. This circular checking proves your SendGrid IP association with your domain and your domain association with your SendGrid IP. -For more information please check out our [Email Infrastructure Guide](https://go.sendgrid.com/SendGrid-Infrastructure-Guide.html?mc=Direct&mcd=https://sendgrid.com/docs/index.html) +{% info %} +In an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS. +{% endinfo %} + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) +- [How to set up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) +- [How to set up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) \ No newline at end of file diff --git a/source/Glossary/scheduled_emails.md b/source/Glossary/scheduled_emails.md index 8d673b66b0..3a2ff0869d 100644 --- a/source/Glossary/scheduled_emails.md +++ b/source/Glossary/scheduled_emails.md @@ -17,5 +17,5 @@ For example if I am a retailer who has a promotion starting at 10:00am you want Whether using [Marketing Campaigns]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.html) or [our transactional APIs]({{root_url}}/API_Reference/SMTP_API/scheduling_parameters.html) you can define parameters on when to send a single email or batches of emails. {% info %} -There is no constraint on how early you can schedule campaigns sent via [Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/index.html). However, all other email sent via SendGrid can only be scheduled up to 72 hours in advance. +If you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid those times (for example, scheduling at 10:53) can result in lower deferral rates because it won't be going through our servers at the same times as everyone else's mail. {% endinfo %} diff --git a/source/Glossary/segments.md b/source/Glossary/segments.md new file mode 100644 index 0000000000..53c702ff85 --- /dev/null +++ b/source/Glossary/segments.md @@ -0,0 +1,17 @@ +--- +seo: + title: + description: Segments are dynamic collections of Marketing Campaigns contacts grouped together, or segmented, based on the criteria you define. + keywords: +title: Segments +weight: 0 +layout: page +navigation: + show: false +--- + +[Segments]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html) are dynamic collections of Marketing Campaigns contacts grouped, or segmented, based on the criteria you define. Groups can include data you track about them, such as gender, location, birthday, or package type, or how they've engaged with your emails previously. You can create a segment that pulls from ALL CONTACTS or a specific existing list. + +Segments are dynamically updated over time as you add customers who meet the criteria of your segment, or as the traits of your contacts change. For example, a segment with the criteria "opened an email within 30 days" will evolve as contacts engage (or don't engage) with your email. Segmentation can be especially useful to ensure that you are targeting the best recipients for your campaign. + +For more information about Segments, please see our [User Guide]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html). diff --git a/source/Glossary/sender_authentication.md b/source/Glossary/sender_authentication.md new file mode 100644 index 0000000000..323424106d --- /dev/null +++ b/source/Glossary/sender_authentication.md @@ -0,0 +1,21 @@ +--- +seo: + title: Sender authentication +title: Sender authentication +weight: 0 +layout: page +navigation: + show: false +--- + +In an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS. + +Sender authentication refers to the process of showing email providers that SendGrid has your permission to send emails on your behalf. To set up sender authentication, add DNS records to your hosting service. These DNS records associate your sending domain with SendGrid — when an inbox provider processes your email, they will see your domain instead of sendgrid.net. You can also set up sender authentication for the links in your email as well as dedicated IP addresses associated with your account (available with Pro level or higher accounts). + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [How to set up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) +- [How to set up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) +- [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) diff --git a/source/Glossary/senders.md b/source/Glossary/senders.md new file mode 100644 index 0000000000..6d5c2a8c8d --- /dev/null +++ b/source/Glossary/senders.md @@ -0,0 +1,15 @@ +--- +seo: + title: Senders + description: Senders in Marketing Campaigns provide identity information about where the emails are coming from for their recipients in campaigns in order to ensure all CAN-SPAM regulations are followed. + keywords: +title: Senders +weight: 0 +layout: page +navigation: + show: false +--- + +[Senders]({{root_url}}/User_Guide/Marketing_Campaigns/senders.html) in Marketing Campaigns is required by CAN-SPAM regulations, and provide identity information about where the emails are coming from in each email you send. + +For more information about Senders, please see our [User Guide]({{root_url}}/User_Guide/Marketing_Campaigns/senders.html). diff --git a/source/Glossary/sends.md b/source/Glossary/sends.md new file mode 100644 index 0000000000..440589f718 --- /dev/null +++ b/source/Glossary/sends.md @@ -0,0 +1,15 @@ +--- +seo: + title: Sends + description: Sends relate to your requests to deliver email to your recipients through SendGrid's API or UI, which you can schedule or retrieve aggregate data from. + keywords: +title: Sends +weight: 0 +layout: page +navigation: + show: false +--- + +[Sends]({{root_url}}/Classroom/Send/index.html) relate to your requests to deliver email to your recipients through SendGrid's API or UI. We process the requests to send the email from you to your contacts and may encounter events such as deferred, delivered, blocked and bounced when we attempt to deliver your email to the corresponding email service providers and email exchange servers. Once the recipient receives the email and interacts with it, more events will be captured such as clicks, opens, unsubscribes, spam reports, etc. We keep track of email events in the [Email Activity]({{root_url}}/User_Guide/email_activity.html) and aggregate data in [Statistics]({{root_url}}/User_Guide/Statistics/index.html). + +For more information about Sends please see our [Classroom]({{root_url}}/Classroom/Send/index.html). diff --git a/source/Glossary/smtp_service.md b/source/Glossary/smtp_service.md index 9fded3634e..acd9dcadfd 100644 --- a/source/Glossary/smtp_service.md +++ b/source/Glossary/smtp_service.md @@ -20,4 +20,4 @@ Another benefit of an SMTP service is scalability. As email programs grow, so do SendGrid’s SMTP service is responsible for 2% of the world’s non-spam email. It provides multiple methods to send email directly using SMTP and also via a Web API with libraries for all popular programming languages. SendGrid’s advanced statistics and analytics give developers all the data they need to follow industry best practices while maintaining visibility into how their emails are performing. -Lastly, SendGrid’s excellent support and compliance teams ensure a happy relationship with both ISPs and customers. \ No newline at end of file +Lastly, SendGrid’s excellent support and compliance teams ensure a happy relationship with both ISPs and customers. diff --git a/source/Glossary/spam.md b/source/Glossary/spam.md index 1a330cb7c6..53e18eab17 100644 --- a/source/Glossary/spam.md +++ b/source/Glossary/spam.md @@ -22,8 +22,8 @@ These are some of the most common reasons for which an email may end up in the S 4. **High Frequency**. This is the number one reason subscribers either hit the Spam Button or Unsubscribe from an email stream. ISPs want to make sure that their users’ mailboxes don’t get crowded and in order to protect their users from email fatigue they can start junking the messages. To avoid this, the best way to go about it is to simply include a link to your [Email Preference Center]({{site.blog_url}}/need-email-preference-center/) in your emails. This way you let your subscribers tell you how often they want to hear from you. -5. **Sending to inactive users**. People’s interests change all the time and so it happens with emails. Subscribers can lose their interest and stop opening the emails. The most common tendency is to send emails to even more users. However, this will only hurt your deliverability even more because ISPs have ways of monitoring the activity of the users. They can check whether users open the emails, click on links, delete or mark emails as spam or not spam, basically they monitor the users’ level of responsiveness or engagement. Based on these metrics ISPs decide folder placement - whether the email goes to the Inbox or if it gets Junked. The only way to avoid hitting the Spam Folder is by tracking [user engagement]({{site.blog_url}}/email-reputation-and-email-engagement-metrics/) as well. For all users except those on the [Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html) plan, SendGrid offers the [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html) to help with that. [Here]({{site.blog_url}}/infer-engagement-with-the-event-api/) is our recommendation on how to use the Event Webhook in tracking your customers' responsiveness to your emails. The key part in tracking user engagement is an appropriate [sunset policy]({{site.blog_url}}/putting-engagement-data-use-sunset-policies/) for your business. Before removing the inactive users from your distribution lists it is worth trying re-engaging them. One great way to do that is by sending them [reconfirmation campaigns]({{root_url}}/Glossary/reconfirmation.html). +5. **Sending to inactive users**. People’s interests change all the time and so it happens with emails. Subscribers can lose their interest and stop opening the emails. The most common tendency is to send emails to even more users. However, this will only hurt your deliverability even more because ISPs have ways of monitoring the activity of the users. They can check whether users open the emails, click on links, delete or mark emails as spam or not spam, basically they monitor the users’ level of responsiveness or engagement. Based on these metrics ISPs decide folder placement - whether the email goes to the Inbox or if it gets Junked. The only way to avoid hitting the Spam Folder is by tracking [user engagement]({{site.blog_url}}/email-reputation-and-email-engagement-metrics/) as well. For all users except those on the [Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html) plan, SendGrid offers the [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html) to help with that. [Here]({{site.blog_url}}/infer-engagement-with-the-event-api/) is our recommendation on how to use the Event Webhook in tracking your customers' responsiveness to your emails. The key part in tracking user engagement is an appropriate [sunset policy]({{site.blog_url}}/putting-engagement-data-use-sunset-policies/) for your business. Before removing the inactive users from your distribution lists it is worth trying re-engaging them. One great way to do that is by sending them [reconfirmation campaigns]({{root_url}}/Glossary/reconfirmation.html). -6. **Inadequate content**. It is well known that the ISPs are protecting their users with the help of spam filters. Using the wrong words or even characters in your email can trigger the spam filters and therefore throw your email in the Spam Folder. The key thing to remember, is that a spam filter is trying to remove commercial advertisements and promotions. So generally, words that are common in such emails should be avoided or used sparingly. That said, take a look at these [100 Spam Trigger Words & Phrases to Avoid](http://blog.hubspot.com/blog/tabid/6307/bid/30684/The-Ultimate-List-of-Email-SPAM-Trigger-Words.aspx). +6. **Inadequate content**. It is well known that the ISPs are protecting their users with the help of spam filters. Using the wrong words or even characters in your email can trigger the spam filters and therefore throw your email in the Spam Folder. The key thing to remember, is that a spam filter is trying to remove commercial advertisements and promotions. So generally, words that are common in such emails should be avoided or used sparingly. That said, take a look at these [100 Spam Trigger Words & Phrases to Avoid](http://blog.hubspot.com/blog/tabid/6307/bid/30684/The-Ultimate-List-of-Email-SPAM-Trigger-Words.aspx). To find out more about what you can do to ensure your email is being received by your recipients, you may also want to check out our [Tips and Tricks to Stay Out of the Spam Folder]({{site.blog_url}}/tips-tricks-stay-spam-folder-qa/). diff --git a/source/Glossary/spam_reports.md b/source/Glossary/spam_reports.md index 7cd9895417..1a4f6494b9 100644 --- a/source/Glossary/spam_reports.md +++ b/source/Glossary/spam_reports.md @@ -12,7 +12,7 @@ navigation: Spam Reports are triggered when a customer clicks the spam button or puts your email in their [spam folder]({{root_url}}/Glossary/bulk_mail_folder.html) within their email client such as Yahoo, Outlook or AOL. Spam reports can only be gathered from Internet Service Providers that provide a Feedback loop. -It is important that spam reporter email addresses are permanently removed from your send list even if the customer has previously opted in. Continuing to send to customers that have reported your email as spam can severely affect your deliverability rating. +It is important that spam reporter email addresses are permanently removed from your send list even if the customer has previously opted in. Continuing to send to customers that have reported your email as spam can severely affect your deliverability rating. {% info %} Important Tip: Make it easier for someone to find the unsubscribe button than it is to find the spam button. diff --git a/source/Glossary/spf.md b/source/Glossary/spf.md index c75ede7574..27676cdbc3 100644 --- a/source/Glossary/spf.md +++ b/source/Glossary/spf.md @@ -12,11 +12,9 @@ navigation: Sender Policy Framework (SPF) is an email authentication standard developed by AOL that compares the email sender’s actual IP address to a list of IP addresses authorized to send mail from that domain. The IP list is published in the domain’s DNS record. {% anchor h2 %} -SPF and Whitelabel +SPF and sender authentication {% endanchor %} -As part of the [whitelabel]({{root_url}}/User_Guide/Setting_Up_Your_Server/Whitelabeling/index.html) process you must create a subdomain (such as em.example.com) which is used for [click and open tracking]({{root_url}}/User_Guide/Delivery_Metrics/email_activity.html) as well as in the Return-Path email header. SPF uses the domain value in the Return-Path header for the DNS lookup to determine the permitted senders for the domain. - If you have an SPF record set for your root domain (i.e. yourdomain.com), you must add {% codeblock %}include:sendgrid.net{% endcodeblock %} before the all mechanism of this record. If you do not have an SPF record for your domain you must create a TXT record with the value: {% codeblock %} @@ -62,7 +60,7 @@ v=spf1 a mx include:_spf.google.com include:spf.protection.outlook.com ip4:12.34 If you wish to add multiple ip4 lookups (if you have an account that sends from multiple dedicated IPs, for example), simply add them into your record separated by spaces. Unlike with include:hostname lookups, a SPF1 record can have any number of ip4 includes. -Please note, the validation step in the [Whitelabel Wizard]({{root_url}}/User_Guide/Setting_Up_Your_Server/Whitelabeling/whitelabel_wizard.html) will not recognize the ip4 mechanism, it will only accept {% codeblock %}include:sendgrid.net{% endcodeblock %} +Please note, the validation step in the setting up domain authentication will not recognize the ip4 mechanism, it will only accept {% codeblock %}include:sendgrid.net{% endcodeblock %} For more information on SPF best practices and syntax, check out [www.openspf.org](http://www.openspf.org) diff --git a/source/Glossary/spoofing.md b/source/Glossary/spoofing.md index 17ceb1745c..359c30f698 100644 --- a/source/Glossary/spoofing.md +++ b/source/Glossary/spoofing.md @@ -10,10 +10,10 @@ navigation: show: false --- -Spoofing is a technique where forged email addresses are used to trick recipients into opening an email because the source has been hidden. This deceptive tactic is used to spread viruses and other malicious programs. Spoofing emails are often sent out as pretending to be large companies trying to steal your account info by having you click a link and enter your account credentials. +Spoofing is a technique where forged email addresses are used to trick recipients into opening an email because the originating source has been hidden. This deceptive tactic can be used to spread viruses or other malicious programs, and is frequently used in conjunction with phishing emails. Spoofed emails are often sent out, pretending to be legitimate companies, in an attempt to steal your account infomation by having you click a link and enter your account credentials. -If you might have been tricked by a phishing email sent via SendGrid, please contact [SendGrid Support]({{site.support_url}}). No matter who sent the phishing email, you can file a report with the [Federal Trade Commission](http://www.ftc.gov/complaint) +If you have been tricked by a phishing email sent via SendGrid, please contact [SendGrid Support]({{site.support_url}}). No matter who sent the phishing email, you can file a report with the [Federal Trade Commission](http://www.ftc.gov/complaint) -If we find out that a customer of ours is sending spoofing or phishing emails we will ban their account immediately. +If we find that a SendGrid customer is sending spoofed or phishing emails, we will ban their account immediately. To get more information please check out our [Email Infrastructure Guide.](https://go.sendgrid.com/SendGrid-Infrastructure-Guide.html?mc=Direct&mcd=https://sendgrid.com/docs/index.html). diff --git a/source/Glossary/subjects.md b/source/Glossary/subjects.md index 91dbd6c010..59672a54d5 100644 --- a/source/Glossary/subjects.md +++ b/source/Glossary/subjects.md @@ -79,6 +79,7 @@ There are a lot of things to know about email. So, we wanted to help you know as Email Harvesting Phishing Sender ID + Senders Spam Filter Spam Reports Spam Traps @@ -89,24 +90,31 @@ There are a lot of things to know about email. So, we wanted to help you know as {% anchor h2 %}SendGrid Services{% endanchor %} Autoresponder Bulk Email Service + Campaigns Categories + Custom Fields Email API Integration Email Service Provider Feedback Loop Email Marketing Event Webhook + Lists Mail Merge MTA Open Relay Reputation Monitoring Reseller Email Account + Reserved Fields Scheduled Emails + Segments + Sends SMTP API SMTP Provider SMTP Relay SMTP Server SMTP Service Subscriber List Management + System Fields Teammates Transport Layer Security Transactional Email diff --git a/source/Glossary/system_fields.md b/source/Glossary/system_fields.md new file mode 100644 index 0000000000..5ba2639f18 --- /dev/null +++ b/source/Glossary/system_fields.md @@ -0,0 +1,15 @@ +--- +seo: + title: System Fields + description: System fields are available in the campaign builder that allow you to insert specific content into your campaign, such as web links, unsubscribe links, or links to your campaign's subscription preferences page. These system substitution tags are not related to your contact data and should not be confused with reserved or custom fields. + keywords: +title: System Fields +weight: 0 +layout: page +navigation: + show: false +--- + +[System Fields]({{root_url}}/Classroom/Basics/Marketing_Campaigns/default_mc_tags.html) are available in the campaign builder that allows you to insert specific content into your campaign, such as web links, unsubscribe links or links to your campaign's subscription preferences page. These system substitution tags are not related to your contact data and should not be confused with reserved or custom fields. + +For more information about System Fields, please see our [Classroom]({{root_url}}/Classroom/Basics/Marketing_Campaigns/default_mc_tags.html). diff --git a/source/Glossary/teammates.md b/source/Glossary/teammates.md index 100422b866..cdab45ddf7 100644 --- a/source/Glossary/teammates.md +++ b/source/Glossary/teammates.md @@ -27,4 +27,4 @@ As an example of role specific permissions, the marketer would be given the foll * [Template Engine]({{root_url}}/User_Guide/Transactional_Templates/index.html) - Full Access * [Tracking]({{root_url}}/User_Guide/Settings/tracking.html) - Full Access -For more information about Teammates please see our [User Guide]({{root_url}}/User_Guide/Settings/teammates.html) and [FAQ]({{root_url}}/Classroom/Basics/Account/teammates_faq.html). +For more information about Teammates please see our [documentation]({{root_url}}/User_Guide/Settings/teammates.html). diff --git a/source/Glossary/throttling.md b/source/Glossary/throttling.md index f4efe20e9f..6dcaa187fb 100644 --- a/source/Glossary/throttling.md +++ b/source/Glossary/throttling.md @@ -20,7 +20,7 @@ Throttling is when a receiving server refuses a message, but with a specific exp What causes a deferral? {% endanchor %} -- The receiving server doesn't recognize your IP, and is afraid you're sending spam. *This is why [warming up]({{root_url}}/Classroom/Deliver/warming_up_ips.html) is so important, so that recipeint mail servers can become used to and anticipate your messages.* +- The receiving server doesn't recognize your IP, and may think you're sending spam. This is why [warming up your IP]({{root_url}}/Classroom/Deliver/warming_up_ips.html) is so important. IP Warmup allows recipient mail servers to become familiar with your sending habits, and later anticipate your messages. - The receiving server doesn't have any open ports to receive email. diff --git a/source/Glossary/timezone.md b/source/Glossary/timezone.md index e7f6e9bf36..b86bc2c23f 100644 --- a/source/Glossary/timezone.md +++ b/source/Glossary/timezone.md @@ -11,13 +11,13 @@ seo: --- Timezones can be a tricky thing to wrangle, because depending on where you normally work and what your current local time is, -you may come across times that don't always jive with what you're expecting. +you may come across times that don't always work with what you're expecting. When you create your SendGrid account, you will set the timezone for your account in your profile. This timezone will be used for times displayed in the SendGrid UI and for scheduling Marketing Campaigns. When you use the API or look at event listings, you may notice something that you receive numbers. These numbers are a [Unix -Timestamp](http://en.wikipedia.org/wiki/Unix_time), which basically means "the number of seconds since "since 00:00:00 Coordinated Universal +Timestamp](http://en.wikipedia.org/wiki/Unix_time), which basically means the number of seconds since "00:00:00 Coordinated Universal Time (UTC), Thursday, 1 January 1970". If for some reason you are running into timezone issues with scheduling Marketing Emails, please remember that you have the option to diff --git a/source/Glossary/tls.md b/source/Glossary/tls.md index f7003d19d7..e2d8c9e878 100644 --- a/source/Glossary/tls.md +++ b/source/Glossary/tls.md @@ -9,12 +9,12 @@ seo: override: true description: Protect transmission of email information with TLS and SendGrid --- -Transport Layer Security (TLS) is an encryption protocol that’s used to encrypt information in transit over the Internet. TLS uses certificates to encrypt sessions to maintain confidentiality of information. SendGrid uses TLS to encrypt sessions with its application via HTTPS and API. +Transport Layer Security (TLS) is an encryption protocol that’s used to encrypt information in transit over the Internet. TLS uses certificates to encrypt sessions to maintain confidentiality of information. SendGrid uses TLS to encrypt sessions with its application via HTTPS and API. -SendGrid also utilizes “opportunistic TLS” for sending email via [SMTP]({{root_url}}/Glossary/smtp.html) or our [Web API]({{root_url}}/API_Reference/Web_API/index.html). Opportunistic TLS means that we will encrypt your email sending from your end point all the way to the recipient, providing that the recipient’s mail server is configured to support TLS. +SendGrid also utilizes “opportunistic TLS” for sending email via [SMTP]({{root_url}}/Glossary/smtp.html) or our [Web API]({{root_url}}/API_Reference/Web_API/index.html). Opportunistic TLS means that we will encrypt your email sending from your end point all the way to the recipient, providing that the recipient’s mail server is configured to support TLS. -Using TLS is increasingly important to protect your privacy and the privacy of your recipients, and to prevent online surveillance. +Using TLS is increasingly important to protect your privacy and the privacy of your recipients, and to prevent online surveillance. -For more background on opportunistic TLS, read our blog post on the [Future of Email Security]({{site.blog_url}}/sendgrid-and-the-future-of-email-security/). +For more background on opportunistic TLS, read our blog post on the [Future of Email Security]({{site.blog_url}}/sendgrid-and-the-future-of-email-security/). For information on configuring your system to utilize TLS, see our information on setting up your server for sending email. diff --git a/source/Glossary/transactional_email.md b/source/Glossary/transactional_email.md index 01760abae8..66078f9ace 100644 --- a/source/Glossary/transactional_email.md +++ b/source/Glossary/transactional_email.md @@ -35,6 +35,6 @@ Transactional email is an incredibly effective communication tool that can help To make sure you're sending the most effective Transactional email, make sure you are building a good email with a good visual, concise content, and appropriate headers. Here are a few good "tools" you can use to get the most out of your Transactional email sending: -A good visual email means the email shows up in a clear and appealing manner to the consumer. Concise content means the email is formatted clearly and there is a good ratio of text, hyperlinks, and pictures. To check your code for these Transactional emails, check out the API library in your preferred programming language from our [API Reference Index]({{root_url}}/API_Reference/index.html). The [SMTPAPI header]({{root_url}}/Utilities/smtpapi_validator.html) will validate the header you've used for SMTP API, and the [SendGrid List Assist]({{site.blog_url}}/introducing-sendgrid-list-assist/) will help you update your email list to get the best deliverability. +A good visual email means the email shows up in a clear and appealing manner to the consumer. Concise content means the email is formatted clearly and there is a good ratio of text, hyperlinks, and pictures. To check your code for these Transactional emails, check out the API library in your preferred programming language from our [API Reference Index]({{root_url}}/API_Reference/index.html). The [SMTPAPI header]({{root_url}}/Utilities/smtpapi_validator.html) will validate the header you've used for SMTP API, and the [SendGrid List Assist]({{site.blog_url}}/introducing-sendgrid-list-assist/) will help you update your email list to get the best deliverability. To learn more about how to maximize your transactional email program, read our free guide [Leveraging Transactional Email for Success]({{site.site_url}}/resources/what-is-transactional-email?mc=Direct&mcd=email_library). diff --git a/source/Glossary/transactional_email_templates.md b/source/Glossary/transactional_email_templates.md index 5d2afb1d55..5eec9d576e 100644 --- a/source/Glossary/transactional_email_templates.md +++ b/source/Glossary/transactional_email_templates.md @@ -24,8 +24,7 @@ Transactional templates allow users to modify their content via WYSIWG or HTML. The transactional templates design section allows marketers to easily design a template, without the need for complex coding. Developers can then manage multiple templates created with a RESTful API and integrate them into applications. -To learn more about the SendGrid transactional email templates, you can visit the [technical documentation]({{root_url}}/API_Reference/Web_API_v3/Transactional_Templates/index.html), watch our [video tutorial]({{root_url}}/VidGrid/template_engine.html) or [online demo webcast](http://go.sendgrid.com/Webcast-SendGrid-Template-Engine-Demo_Registration.html), or read the [Template Engine blog post]({{site.blog_url}}/sendgrid-transactional-email-template-engine-announcement/). - +To learn more about the SendGrid transactional email templates, you can visit the [technical documentation]({{root_url}}/User_Guide/Transactional_Templates/create__and_edit_transactional_templates.html), or the [API Reference]({{root_url}}/API_Reference/Web_API_v3/Transactional_Templates/index.html) By using SendGrid's transactional template application, marketers can maintain control of their email design while enjoying the strong [email deliverability]({{root_url}}/Glossary/email_deliverability.html) that SendGrid provides. They can create a vast array of different email templates, all with the confidence of knowing their emails will reach the inbox. [Contact the SendGrid support team](https://sendgrid.zendesk.com/hc/en-us) if you have any questions about implementing and using transactional templates or visit our blog to learn more about [marketing and transactional email best practices]({{site.blog_url}}/marketing-and-transactional-email-best-practices-checklist-2/). diff --git a/source/Glossary/triggered_actions.md b/source/Glossary/triggered_actions.md index 05f722954e..9f730a8c84 100644 --- a/source/Glossary/triggered_actions.md +++ b/source/Glossary/triggered_actions.md @@ -12,7 +12,7 @@ navigation: Triggered actions are automatically initiated when a specific [triggering event]({{root_url}}/Glossary/triggering_events.html) that you are tracking takes place. These actions must be defined in advance, and they must be associated with a predetermined user and event. -SendGrid has partnered with [Klaviyo](https://sendgrid.com/partners/klaviyo/) to help you drive sales by using data to send triggered email, segment your lists, run better facebook ads, and more. An example of a triggered action might be an email message (or series of messages) welcoming a new user to your website or application. +SendGrid has partnered with [Klaviyo](https://sendgrid.com/partners/klaviyo/) to help you drive sales by using data to send triggered email, segment your lists, run better Facebook ads, and more. An example of a triggered action might be an email message (or series of messages) welcoming a new user to your website or application. {% info %} To learn more about the different actions that Klaviyo can provide visit their [website](https://www.klaviyo.com/). diff --git a/source/Glossary/unknown_user.md b/source/Glossary/unknown_user.md new file mode 100644 index 0000000000..2dcbb288fe --- /dev/null +++ b/source/Glossary/unknown_user.md @@ -0,0 +1,24 @@ +--- +seo: + title: Unknown User + description: Bounced - Unknown User is an error indicating the email address does not exist. + keywords: unknown, user, bounce, undelivered, email +title: Unknown User +weight: 0 +layout: page +navigation: + show: false +--- + +If an email address (user) does not exist at the organization or domain, it will receive Unknown User - a hard bounce error. + +It is usually caused due to SMTP 5.5.0 errors which cause an email to be undeliverable to an inactive, incorrect, or disabled recipient address. + +{% anchor h3 %} +Additional Resources +{% endanchor %} + +* [Delivery Metrics]({{root_url}}/User_Guide/Statistics/index.html) +* [Bounces]({{root_url}}/Glossary/bounces.html) +* [Subscriber List Management]({{root_url}}/Glossary/subscriber_list_management.html) +* [Deliverability Center](https://sendgrid.com/deliverabilitycenter) diff --git a/source/Glossary/white_hat_sender.md b/source/Glossary/white_hat_sender.md index bc72d2d6ff..88bdc26d77 100644 --- a/source/Glossary/white_hat_sender.md +++ b/source/Glossary/white_hat_sender.md @@ -11,11 +11,11 @@ navigation: A white hat sender is a sender or company who only sends email to those recipients who have given express permission to receive email from the sender. Put simply, white hat senders always strive to “send the right message, to the right person, at the right time, with the right frequency.” -SendGrid has a plethora of resources to help you be a white hat sender, and to get your email to the inbox, and not to the spam folder. Check out our [email deliverability]({{root_url}}/Classroom/Deliver/index.html) tips to help. +SendGrid has a plethora of resources to help you be a white hat sender, and to get your email to the inbox, and not to the spam folder. Check out our [email deliverability]({{root_url}}/Classroom/Deliver/index.html) tips to help. For more information: * [Bulk Email Folder]({{root_url}}/Glossary/bulk_mail_folder.html) * [Email Deliverability]({{root_url}}/Glossary/email_deliverability.html) -* [Whitelabel Settings]({{root_url}}/User_Guide/Settings/Whitelabel/index.html) +* [Sender authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) * [Black Hat Sender]({{root_url}}/Glossary/black_hat_sender.html) diff --git a/source/Glossary/whitelabel.md b/source/Glossary/whitelabel.md new file mode 100644 index 0000000000..610c9dbbef --- /dev/null +++ b/source/Glossary/whitelabel.md @@ -0,0 +1,21 @@ +--- +seo: + title: Whitelabel +title: Whitelabel +weight: 0 +layout: page +navigation: + show: false +--- + +In an attempt to clarify complex functionality, SendGrid is upgrading the name of Whitelabel. A whitelabel is now generally called sender authentication. A domain whitelabel is now called domain authentication. A link whitelabel is now called link branding. An IP Whitelabel is now called reverse DNS. + +Whitelabeling refers to the process of showing ISPs that SendGrid has your permission to send emails on your behalf. To set up a whitelabel, add DNS records to your hosting service. These DNS records associate your sending domain with SendGrid— when an inbox provider processes your email, they will see your domain instead of sendgrid.net. You can also add whitelabels for the links in your email as well as dedicated IP addresses associated with your account (available with Pro level or higher accounts). + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [How to set up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) +- [How to set up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) +- [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) diff --git a/source/Glossary/x_message_id.md b/source/Glossary/x_message_id.md new file mode 100644 index 0000000000..c7e38d2812 --- /dev/null +++ b/source/Glossary/x_message_id.md @@ -0,0 +1,24 @@ +--- +seo: + title: X-Message-ID + description: The X-Message-ID is a header returned when making a mail send. + keywords: X-Message-ID, Track +title: X-Message-ID +weight: 0 +layout: page +navigation: + show: false +--- + +The following image depicts a response after the mail is sent. + +![]({{root_url}}/images/example_response.png "Example Response") + +The X-Message-ID is a header returned when making a mail send which can be used to track events that the Event Webhook posts. + +When using the Event Webhook, it's best practice to store your X-Message-ID. X-Message-ID data helps with deduplications in your webhook data. It can be used to find all corresponding Message-IDs. + +SendGrid recommends that users store this data to correlate to their Event Webhook data, and this data is very useful for Support troubleshooting. + +Related Articles +- [Message-ID]({{root_url}}/Glossary/message_id.html) diff --git a/source/Integrate/Code_Examples/SMTP_API_Header_Examples/perl.html b/source/Integrate/Code_Examples/SMTP_API_Header_Examples/perl.html index 4b2e625144..48c5a5e345 100644 --- a/source/Integrate/Code_Examples/SMTP_API_Header_Examples/perl.html +++ b/source/Integrate/Code_Examples/SMTP_API_Header_Examples/perl.html @@ -171,7 +171,7 @@ my $from = 'you@yourdomain.com'; # For multiple recipient e-mails, the 'to' address is irrelivant -my $to = 'doesntmatter@nowhere.com'; +my $to = 'example@example.com'; my $plain = < $html); # Login credentials -my $username = 'yourlogin@sendgrid.net'; +my $username = 'example@example.com'; my $password = "yourpassword"; # Open a connection to the SendGrid mail server diff --git a/source/Integrate/Code_Examples/SMTP_API_Header_Examples/ruby.md b/source/Integrate/Code_Examples/SMTP_API_Header_Examples/ruby.md index 1cf7ff8c9e..740f9218a4 100644 --- a/source/Integrate/Code_Examples/SMTP_API_Header_Examples/ruby.md +++ b/source/Integrate/Code_Examples/SMTP_API_Header_Examples/ruby.md @@ -101,7 +101,7 @@ end hdr = SmtpApiHeader.new -receiver = ['recipient1@domain.com', 'recipient2@domain.com'] +receiver = ['recipienteexampexample@example.com', 'recipient2@domain.com'] hdr.addTo(receiver) hdr.setUniqueArgs({'test' => 1, 'foo' =>2}) diff --git a/source/Integrate/Code_Examples/Webhook_Examples/csharp.md b/source/Integrate/Code_Examples/Webhook_Examples/csharp.md index 476957dc81..983f2db5d8 100644 --- a/source/Integrate/Code_Examples/Webhook_Examples/csharp.md +++ b/source/Integrate/Code_Examples/Webhook_Examples/csharp.md @@ -87,7 +87,7 @@ public class Email } {% endcodeblock %} - To test this, we send an email to alex@email.sendgrid.biz, and put the following method in our ApiController. Note: Don't forget the attribute. + To test this, we send an email to example@example.com, and put the following method in our ApiController. Note: Don't forget the attribute. {% codeblock lang:csharp %} // POST api/inbound diff --git a/source/Integrate/Code_Examples/Webhook_Examples/go.md b/source/Integrate/Code_Examples/Webhook_Examples/go.md index 3d2fee7581..fcab27c9f4 100644 --- a/source/Integrate/Code_Examples/Webhook_Examples/go.md +++ b/source/Integrate/Code_Examples/Webhook_Examples/go.md @@ -26,7 +26,7 @@ Hostname: email.sendgrid.biz URL: http://sendgrid.biz/upload {% endcodeblock %} - To test this scenario, we sent an email to isaac@email.sendgrid.biz and created the following code: + To test this scenario, we sent an email to example@example.com and created the following code: {% codeblock lang:go %} @@ -68,5 +68,6 @@ func main() { if err != nil { log.Fatal("ListenAndServe: ", err) } +} {% endcodeblock %} diff --git a/source/Integrate/Code_Examples/Webhook_Examples/index.html b/source/Integrate/Code_Examples/Webhook_Examples/index.html index cd60fbe110..47b14fa4a6 100644 --- a/source/Integrate/Code_Examples/Webhook_Examples/index.html +++ b/source/Integrate/Code_Examples/Webhook_Examples/index.html @@ -6,7 +6,7 @@ show: true --- -Here is a list of the different Webhook Examples that can be used with SendGrid. Listed below are different coding language examples, as well as a few applications and partnerships that have used the SendGrid Webhook. +Here is a list of the different Webhook Examples that can be used with SendGrid. Listed below are different coding language examples, as well as a few applications and partnerships that have used the SendGrid Webhook. {% anchor h2 %} Language Based Examples diff --git a/source/Integrate/Code_Examples/Webhook_Examples/nodejs.md b/source/Integrate/Code_Examples/Webhook_Examples/nodejs.md index 430484302d..7154c0dbdf 100644 --- a/source/Integrate/Code_Examples/Webhook_Examples/nodejs.md +++ b/source/Integrate/Code_Examples/Webhook_Examples/nodejs.md @@ -22,7 +22,7 @@ Hostname: email.sendgrid.biz URL: http://sendgrid.biz/parse {% endcodeblock %} - To test this scenario, we sent an email to isaac@email.sendgrid.biz and created the following code: + To test this scenario, we sent an email to example@example.com and created the following code: {% codeblock lang:javascript %} diff --git a/source/Integrate/Code_Examples/Webhook_Examples/php.md b/source/Integrate/Code_Examples/Webhook_Examples/php.md index eb1870040c..27543d103a 100644 --- a/source/Integrate/Code_Examples/Webhook_Examples/php.md +++ b/source/Integrate/Code_Examples/Webhook_Examples/php.md @@ -22,7 +22,7 @@ Hostname: email.sendgrid.biz URL: https://sendgrid.com/email.php {% endcodeblock %} - To test this scenario, we sent an email to isaac@email.sendgrid.biz and created the following form at https://sendgrid.com/email.php: + To test this scenario, we sent an email to example@example.com and created the following form at https://sendgrid.com/email.php: {% codeblock lang:php %}
-

Web API v3 Code Examples

+

Web API v3 Code Examples

Learn how to quickly start sending email through SendGrid's Web API v3. Here you will find code examples for our latest v3 Mail Send endpoint in 7 different programming languages.

diff --git a/source/Integrate/Code_Examples/v2_Mail/csharp.md b/source/Integrate/Code_Examples/v2_Mail/csharp.md index 514d7902ac..f7e23e6f45 100644 --- a/source/Integrate/Code_Examples/v2_Mail/csharp.md +++ b/source/Integrate/Code_Examples/v2_Mail/csharp.md @@ -10,6 +10,10 @@ navigation: We recommend using SendGrid C#, our client library, available on Github, with full documentation. {% endgithub %} +{% info %} +The library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in C#](https://github.com/sendgrid/sendgrid-csharp/blob/master/TROUBLESHOOTING.md#v2). +{% endinfo %} + {% anchor h2 %}Using SendGrid's C# Library{% endanchor %} {% codeblock lang:csharp %} // using SendGrid's C# Library - https://github.com/sendgrid/sendgrid-csharp @@ -24,7 +28,8 @@ myMessage.Text = "and easy to do anywhere, even with C#"; var transportWeb = new SendGrid.Web("SENDGRID_APIKEY"); transportWeb.DeliverAsync(myMessage); -// NOTE: If you're developing a Console Application, use the following so that the API call has time to complete +// NOTE: If you're developing a Console Application, +// use the following so that the API call has time to complete // transportWeb.DeliverAsync(myMessage).Wait(); {% endcodeblock %} @@ -46,7 +51,7 @@ If you are using ASP.NET, you can specify SMTP settings in web.config. {% endcodeblock %} -This C# program will build a MIME email and send it through SendGrid. .NET already has built in libraries to send and receive emails. +This C# program will build a MIME email and send it through SendGrid. .NET already has built in libraries to send and receive emails. This example uses: [.NET Mail](http://msdn.microsoft.com/en-us/library/system.net.mail.aspx) diff --git a/source/Integrate/Code_Examples/v2_Mail/go.md b/source/Integrate/Code_Examples/v2_Mail/go.md index ac9ce4610c..d19845aaa8 100644 --- a/source/Integrate/Code_Examples/v2_Mail/go.md +++ b/source/Integrate/Code_Examples/v2_Mail/go.md @@ -10,6 +10,10 @@ navigation: We recommend using SendGrid Go, our client library, available on Github, with full documentation. {% endgithub %} +{% info %} +The library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Go](https://github.com/sendgrid/sendgrid-go/blob/master/TROUBLESHOOTING.md#v2). +{% endinfo %} + {% anchor h2 %} Using SendGrid's Go Library {% endanchor %} {% codeblock lang:go %} // using SendGrid's Go Library diff --git a/source/Integrate/Code_Examples/v2_Mail/java.md b/source/Integrate/Code_Examples/v2_Mail/java.md index f468be552e..08345397b3 100644 --- a/source/Integrate/Code_Examples/v2_Mail/java.md +++ b/source/Integrate/Code_Examples/v2_Mail/java.md @@ -7,6 +7,10 @@ navigation: --- {% github sendgrid/sendgrid-java#usage Java %} We recommend using SendGrid Java, our client library, available on Github, with full documentation. {% endgithub %} +{% info %} +The library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Java](https://github.com/sendgrid/sendgrid-java/blob/master/TROUBLESHOOTING.md#v2). +{% endinfo %} + {% anchor h2 %} Using SendGrid's Java Library {% endanchor %} {% codeblock lang:java %} // using SendGrid's Java Library diff --git a/source/Integrate/Code_Examples/v2_Mail/nodejs.md b/source/Integrate/Code_Examples/v2_Mail/nodejs.md index 999160114f..948b881665 100644 --- a/source/Integrate/Code_Examples/v2_Mail/nodejs.md +++ b/source/Integrate/Code_Examples/v2_Mail/nodejs.md @@ -1,11 +1,15 @@ --- layout: page weight: 0 -title: Node.js +title: v2 Node.js navigation: show: true --- -{% github sendgrid/sendgrid-nodejs#usage Node.js %} We recommend using SendGrid Node.js, our client library, available on Github, with full documentation. {% endgithub %} +{% github sendgrid/sendgrid-nodejs#usage Node.js %} We recommend using v3 SendGrid Node.js, our client library, available on Github, with full documentation. {% endgithub %} + +{% info %} +The library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Node.js](https://github.com/sendgrid/sendgrid-nodejs/blob/master/TROUBLESHOOTING.md#v2). +{% endinfo %} {% anchor h2 %} Using SendGrid's Node.js Library {% endanchor %} {% codeblock lang:js %} diff --git a/source/Integrate/Code_Examples/v2_Mail/perl.html b/source/Integrate/Code_Examples/v2_Mail/perl.html index a9b7115598..c0e516abdd 100644 --- a/source/Integrate/Code_Examples/v2_Mail/perl.html +++ b/source/Integrate/Code_Examples/v2_Mail/perl.html @@ -21,7 +21,7 @@ my $sendgrid = Mail::SendGrid->new( from => "test@sendgrid.com", - to => "you@youreamil.com", + to => "example@example.com", subject => "Sending with SendGrid is Fun", html => "and easy to do anywhere, even with Perl" ); @@ -52,7 +52,7 @@ # to is who you are sending your email to # subject will be the subject line of your email my $from = 'you@yourdomain.com'; -my $to = 'person@youaremailing.com'; +my $to = 'example@example.com'; my $subject = 'Example Perl Email'; # Create the MIME message that will be sent. Check out MIME::Entity on CPAN for more details @@ -97,7 +97,7 @@ ) or die "Error adding !\n"; # Login credentials -my $username = 'yourlogin@sendgrid.net'; +my $username = 'example@example.com'; my $password = "yourpassword"; # Open a connection to the SendGrid mail server diff --git a/source/Integrate/Code_Examples/v2_Mail/php.md b/source/Integrate/Code_Examples/v2_Mail/php.md index a24d70d858..4a977bc200 100644 --- a/source/Integrate/Code_Examples/v2_Mail/php.md +++ b/source/Integrate/Code_Examples/v2_Mail/php.md @@ -11,6 +11,10 @@ navigation: --- {% github sendgrid/sendgrid-php#usage PHP %} We recommend using SendGrid PHP, our client library, available on Github, with full documentation. {% endgithub %} +{% info %} +The library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in PHP](https://github.com/sendgrid/sendgrid-php/blob/master/TROUBLESHOOTING.md#v2). +{% endinfo %} + {% anchor h2 %}Using SendGrid's PHP Library{% endanchor %} {% codeblock lang:php %} // using SendGrid's PHP Library diff --git a/source/Integrate/Code_Examples/v2_Mail/python.md b/source/Integrate/Code_Examples/v2_Mail/python.md index b61efaf18e..30045ebd01 100644 --- a/source/Integrate/Code_Examples/v2_Mail/python.md +++ b/source/Integrate/Code_Examples/v2_Mail/python.md @@ -10,6 +10,10 @@ navigation: We recommend using SendGrid Python, our client library, available on Github, with full documentation. {% endgithub %} +{% info %} +The library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Python](https://github.com/sendgrid/sendgrid-python/blob/master/TROUBLESHOOTING.md#v2). +{% endinfo %} + {% anchor h2 %} Using SendGrid's Python Library {% endanchor %} {% codeblock lang:python %} # using SendGrid's Python Library diff --git a/source/Integrate/Code_Examples/v2_Mail/ruby.md b/source/Integrate/Code_Examples/v2_Mail/ruby.md index 13412137c8..3fee5c77a4 100644 --- a/source/Integrate/Code_Examples/v2_Mail/ruby.md +++ b/source/Integrate/Code_Examples/v2_Mail/ruby.md @@ -8,6 +8,10 @@ navigation: {% github sendgrid/sendgrid-ruby#usage PHP %} We recommend using SendGrid Ruby, our client library, available on Github, with full documentation. {% endgithub %} +{% info %} +The library does not officially support the V2 API, but you can use V2 with an older version of the library. For more information, see [Continue Using V2 in Ruby](https://github.com/sendgrid/sendgrid-ruby/blob/master/TROUBLESHOOTING.md#v2). +{% endinfo %} + {% anchor h2 %} Using SendGrid's Ruby Library {% endanchor %} {% codeblock lang:ruby %} # using SendGrid's Ruby Library diff --git a/source/Integrate/Frameworks/codeigniter.md b/source/Integrate/Frameworks/codeigniter.md index 9c73af7542..8a0e0ac09f 100644 --- a/source/Integrate/Frameworks/codeigniter.md +++ b/source/Integrate/Frameworks/codeigniter.md @@ -30,7 +30,7 @@ $this->email->initialize(array( )); $this->email->from('your@example.com', 'Your Name'); -$this->email->to('someone@example.com'); +$this->email->to('someoneexampexample@example.com'); $this->email->cc('another@another-example.com'); $this->email->bcc('them@their-example.com'); $this->email->subject('Email Test'); diff --git a/source/Integrate/Frameworks/laravel.md b/source/Integrate/Frameworks/laravel.md index ca85aac1a0..bd86054fa5 100644 --- a/source/Integrate/Frameworks/laravel.md +++ b/source/Integrate/Frameworks/laravel.md @@ -4,83 +4,193 @@ weight: 0 title: Laravel seo: title: Send Email with Laravel & SendGrid - description: View instructions on how to easily send email with Laravel using SendGrid, by setting up setting up Laravel's built in mailer. + description: View instructions on how to easily send email with Laravel using SendGrid, by setting up setting up Laravel's Mailables Class. navigation: show: true --- -Laravel comes with an email sending library built in, so we just need to set it to use SendGrid over SMTP. Check out the docs for [Laravel's mailer](http://laravel.com/docs/mail) for details. +Laravel provides a clean API over the popular SwiftMailer library with drivers for SMTP, PHP's `mail`, `sendmail` and more. For this example, we'll be sending an email with SendGrid using the SMTP Driver. For more information, check out the docs for [Laravel's Mail interface](http://laravel.com/docs/mail). -In `app/config/mail.php` you need to configure these settings: +Laravel 5.5 LTS uses Mailable classes. Mailables in Laravel abstracts building emails with a mailable class. Mailables are responsible for collating data and passing them to views. + +{% anchor h2 %} +Before you begin +{% endanchor %} + +In `.env` you need to find and configure these variables: + +{% codeblock %} +MAIL_DRIVER=smtp +MAIL_HOST=smtp.sendgrid.net +MAIL_PORT=587 +MAIL_USERNAME=sendgrid_username +MAIL_PASSWORD=sendgrid_password +MAIL_ENCRYPTION=tls +MAIL_FROM_NAME="John Smith" +MAIL_FROM_ADDRESS=from@example.com +{% endcodeblock %} + +{% info %} +The `MAIL_FROM_NAME` field requires double quotes because there is a space in the string. +{% endinfo %} + +{% info %} +You can send `100 messages per SMTP connection` at a time, and open up to `10 concurrent connections` from a single server at a time. +{% endinfo %} + +{% anchor h2 %} +Creating a Mailable +{% endanchor %} + +Next you need to create a Mailable class, Laravel's CLI tool called Artisan makes that a simple feat. +Open CLI, go to the project directory and type: + +`php artisan make:mail TestEmail` + +This command will create a new file under `app/Mail/TestEmail.php` and it should look something like this: {% codeblock lang:php %} 'smtp', - 'host' => 'smtp.sendgrid.net', - 'port' => 587, - 'from' => array('address' => 'from@example.com', 'name' => 'John Smith'), - 'encryption' => 'tls', - 'username' => 'sendgrid_username', - 'password' => 'sendgrid_password', -); - -?> +namespace App\Mail; + +use Illuminate\Bus\Queueable; +use Illuminate\Mail\Mailable; +use Illuminate\Queue\SerializesModels; +use Illuminate\Contracts\Queue\ShouldQueue; + +class TestEmail extends Mailable +{ + use Queueable, SerializesModels; + + public $data; + + public function __construct($data) + { + $this->data = $data; + } + + public function build() + { + $address = 'janeexampexample@example.com'; + $subject = 'This is a demo!'; + $name = 'Jane Doe'; + + return $this->view('emails.test') + ->from($address, $name) + ->cc($address, $name) + ->bcc($address, $name) + ->replyTo($address, $name) + ->subject($subject) + ->with([ 'message' => $this->data['message'] ]); + } +} {% endcodeblock %} -You can use Laravel's Mail class just like you normally would, but all email will be sent through SendGrid! +In Laravel `Views` are used as 'templates' when sending an email. Let's create a file under `app/resources/views/emails/test.blade.php` and insert this code: + +{% codeblock lang:html %} + + + + + + +

Test Email

+

{{ $message }}

+ + +{% endcodeblock %} + +{% anchor h2 %} +Sending an email +{% endanchor %} + +Now that we have our Mailable Class created, all we need to do is run this code: {% codeblock lang:php %} to('jane@example.com', 'Jane Doe')->subject('This is a demo!'); -}); + $data = ['message' => 'This is a test!']; -?> + Mail::to('john@example.com')->send(new TestEmail($data)); {% endcodeblock %} -## Adding a category or custom field +{% anchor h2 %} +Adding a category or custom field +{% endanchor %} -Categories in sendgrid allow you to split your statistics into categories. An example would be if you have a white labeled service you can split your statistics by the user login. +Categories in SendGrid allow you to split your statistics into sections. For example, if you have a Whitelabeled service, you can split your statistics by the user login. -Another useful feature of sendgrid is the notifications. If you want to complete the feedback loop for your product you can pass identifiers as a header which relate to a record in your database which you can then parse the notifications against that record to track deliveries/opens/clicks/bounces. +Another useful tool is event notifications. If you want to complete the feedback loop for your product you can pass identifiers as a header which relate to a record in your database which you can then parse the notifications against that record to track deliveries/opens/clicks/bounces. +The `withSwiftMessage` method of the `Mailable` base class allows you to register the callback that is invoked with the raw SwiftMailer message instance before sending the message. This knowledge allows you to customize the message before delivery. To customize your message, use something similar to this: {% codeblock lang:php %} asString($data); +use Illuminate\Bus\Queueable; +use Illuminate\Mail\Mailable; +use Illuminate\Queue\SerializesModels; +use Illuminate\Contracts\Queue\ShouldQueue; - $message->getSwiftMessage()->getHeaders()->addTextHeader('X-SMTPAPI', $header); +class TestEmail extends Mailable +{ + use Queueable, SerializesModels; - $message->to('jane@example.com', 'Jane Doe')->subject('This is a demo!'); - }); + public $data; + public function __construct($data) + { + $this->data = $data; + } - private function asJSON($data) // set as private with the expectation of being a class method + public function build() { - $json = json_encode($data); + $address = 'janeexampexample@example.com'; + $subject = 'This is a demo!'; + $name = 'Jane Doe'; + + $headerData = [ + 'category' => 'category', + 'unique_args' => [ + 'variable_1' => 'abc' + ] + ]; + + $header = $this->asString($headerData); + + $this->withSwiftMessage(function ($message) use ($header) { + $message->getHeaders() + ->addTextHeader('X-SMTPAPI', $header); + }); + + return $this->view('emails.test') + ->from($address, $name) + ->cc($address, $name) + ->bcc($address, $name) + ->replyTo($address, $name) + ->subject($subject) + ->with([ 'data' => $this->data ]); + } + private function asJSON($data) + { + $json = json_encode($data); $json = preg_replace('/(["\]}])([,:])(["\[{])/', '$1$2 $3', $json); return $json; } - private function asString($data) // set as private with the expectation of being a class method + + private function asString($data) { $json = $this->asJSON($data); - $str = wordwrap($json, 76, "\n "); - - return $str; + + return wordwrap($json, 76, "\n "); } -?> +} {% endcodeblock %} - diff --git a/source/Integrate/Frameworks/zend.md b/source/Integrate/Frameworks/zend.md index caf20f0198..3e514d64be 100644 --- a/source/Integrate/Frameworks/zend.md +++ b/source/Integrate/Frameworks/zend.md @@ -30,7 +30,7 @@ $transport = new Zend_Mail_Transport_Smtp($smtpServer, $config); $mail = new Zend_Mail(); -$mail->setFrom('sender@example.com', 'Some Sender'); +$mail->setFrom('sendeexampexample@example.com', 'Some Sender'); $mail->addTo('email@example.com','Some Recipient'); $mail->setSubject('Test Subject'); $mail->setBodyText('This is the text of the mail using Zend.'); diff --git a/source/Integrate/Mail_Clients/applemail.md b/source/Integrate/Mail_Clients/applemail.md index 4ce94cf1ac..7ab2c47ee7 100644 --- a/source/Integrate/Mail_Clients/applemail.md +++ b/source/Integrate/Mail_Clients/applemail.md @@ -12,35 +12,46 @@ These instructions show how to add an SMTP server to an existing Mail account, b Adding SMTP settings {% endanchor %} -Go to Mail -\> Preferences (⌘,). On the account you want to edit, click the dropdown that says **Outgoing Mail Server (SMTP):**, and select **Edit SMTP Server List...**. +Go to Mail -\> Preferences (⌘,). On the account you want to edit, click the tab that says **Server Settings**, then click the **Outgoing Mail Account** dropdown and select **Edit SMTP Server List...**. -![Mail, Preferences, Outgoing Mail Server (SMTP) dropdown, Edit SMTP Server List]({{root_url}}/images/apple_mail_1.png "Edit SMTP Server List") +![Mail, Preferences, Outgoing Mail Server (SMTP) dropdown, Edit SMTP Server List]({{root_url}}/images/NewAppleMail_Step_1.png "Edit SMTP Server List") Next click the **+** under the list of SMTP servers, and add a new one. -![The plus button to click to add an SMTP server]({{root_url}}/images/apple_mail_2.png "Add SMTP Server") +![The plus button to click to add an SMTP server]({{root_url}}/images/NewAppleMail_Step_2.png "Add SMTP Server") Then enter the server details: -- **Server Name:** smtp.sendgrid.net - **Description:** SendGrid -- **Ports:** Use default ports -- **Encryption:**Use Secure Sockets Layer (SSL) -- **Authentication:** Password - **User Name:** SendGrid account username - **Password:** SendGrid account password +- **Host Name:** smtp.sendgrid.net +- Uncheck **Automatically manage connection settings** if you want to specify Custom Ports, Encryption Type and Authentication +- **Port:** Specify port +- **Encryption:** Check or uncheck Use TLS/SSL +- **Authentication:** Password +

-![Settings for Mail to use SendGrid SMTP]({{root_url}}/images/apple_mail_3.png "SendGrid SMTP server settings") +![Settings for Mail to use SendGrid SMTP]({{root_url}}/images/NewAppleMail_Step_3.png "SendGrid SMTP server settings") -When writing a message, there is a dropdown beneath the Subject field, where you can define the outgoing server you wish to use. This way, you can send individual messages to your regular SMTP, and the messages you need to send through SendGrid can go through us. Please note that when you select this, it will be remembered until you change the selection. +Now the SendGrid SMTP Server can be specified on the **Accounts** tab of the **Preferences** window in the **Outgoing Mail Account** dropdown. Once this is selected, mail sent out of Apple Mail going forward will use the SMTP server chosen until specified otherwise. -![The dropdown menu to select the SMTP server to use for this send.]({{root_url}}/images/apple_mail_4.png "SMTP server dropdown") +![The dropdown menu to select the SMTP server to use for this send.]({{root_url}}/images/NewAppleMail_Step_4.png "SMTP server dropdown") {% info %} Unfortunately, there is not an easy way to add SMTP API headers to a message in Mail. {% endinfo %} -{% info %} -Mail sometimes attaches images in a way that is incompatible with other email readers, but this is [correctable](http://micahgilman.com/play/disable-mac-mailapp-inline-image-attachments/). -{% endinfo %} +{% anchor h2 %} +Attachment Compatibility +{% endanchor %} + +Mail will sometimes attach images in a way that is incompatible with other email readers. However, this behavior can be be changed so that Mail will send more traditional non-inline attachments. + +1. Open Terminal (found in Finder > Applications > Utilities). +1. In Terminal, paste the following: ```defaults write com.apple.mail DisableInlineAttachmentViewing -bool yes```. +1. Press return. +1. Restart the Mail app. + +If you wish to restore the normal behavior of Mail, repeat the steps above while using the following command: ```defaults write com.apple.mail DisableInlineAttachmentViewing -bool yes```. diff --git a/source/Integrate/Mail_Clients/outlook_2013.md b/source/Integrate/Mail_Clients/outlook_2013.md index 3fbbee4353..8f0935f73a 100644 --- a/source/Integrate/Mail_Clients/outlook_2013.md +++ b/source/Integrate/Mail_Clients/outlook_2013.md @@ -39,6 +39,6 @@ If everything checks out correct then you should see this. ![]({{root_url}}/images/outlook_2013_6.png "All tests completed successfully") -You should be all set at this point. If you need more support please contact support@sendgrid.com . +You should be all set at this point. If you need more assistance, please [contact support](https://support.sendgrid.com/hc/en-us). -![]({{root_url}}/images/outlook_2013_7.png "Congratulations") \ No newline at end of file +![]({{root_url}}/images/outlook_2013_7.png "Congratulations") diff --git a/source/Integrate/Mail_Clients/thunderbird.md b/source/Integrate/Mail_Clients/thunderbird.md index 632e0f3d43..a48ac64ab2 100644 --- a/source/Integrate/Mail_Clients/thunderbird.md +++ b/source/Integrate/Mail_Clients/thunderbird.md @@ -6,7 +6,7 @@ navigation: show: true --- -To send email using Thunderbird you will have to modify your outgoing server settings in Thunderbird accordingly. Additionally you can modify settings in Thunderbird that will allow you to include an [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html) header in your emails if you wish to leverage [categories]({{root_url}}/User_Guide/Delivery_Metrics/categories.html) or other features of the SMTP API when sending mail via the Thunderbird client. +To send email using Thunderbird you will have to modify your outgoing server settings in Thunderbird accordingly. Additionally you can modify settings in Thunderbird that will allow you to include an [SMTP API]({{root_url}}/API_Reference/SMTP_API/index.html) header in your emails if you wish to leverage [categories]({{root_url}}/User_Guide/Statistics/categories.html) or other features of the SMTP API when sending mail via the Thunderbird client.

Start by going to: 'Tools' -\> 'Account Settings' diff --git a/source/Integrate/Mail_Servers/exchange_2010.md b/source/Integrate/Mail_Servers/exchange_2010.md index 2dd7080f2f..3c42676dc6 100644 --- a/source/Integrate/Mail_Servers/exchange_2010.md +++ b/source/Integrate/Mail_Servers/exchange_2010.md @@ -18,15 +18,15 @@ This documentation assumes that you already have a working installation of Excha The configuration of a new send connector is straight forward. It is the associated configurations that you may require in order to properly control access to the connector that may be complicated. Let's start with just sending email through SendGrid: -1. Login to your Exchange server or a server that has the Exchange Management Console installed for administrative purposes. -2. Go to **Start \> All Programs \> Microsoft Exchange Server 2010** and click on the **Exchange Management Console** item. -3. Roll open the **Organization Configuration** list and select **Hub Transport**. -4. Click on **New Send Connector** in the Actions sidebar. -5. Name the Send Connector whatever you like and select Internet for the Intended Use pull-down. This allows for the integration with an authenticated SmartHost and adds the default send permissions required by Exchange 2010 to route messages through an external host that is not a part of the domain forest. -6. Click **Next**. -7. Click Add and specify the allowed address space to which the connector can send messages. If you want to send to anyone on the internet, then you would insert an "\*" in the Address field. If you want to send only to a specific domain, enter that domain. If you want to allow all sub-domains you can check the box, but I prefer to notate that literally like so: \*.SAMPLEDOMAIN.COM. Insert a high cost (100 is the top, so choose wisely) so that the connector is not used inadvertantly. -8. Click **Next**. -9. On the Network Settings page, select the **Route mail through the following smart hosts** item. +1. Login to your Exchange server or a server that has the Exchange Management Console installed for administrative purposes. +2. Go to **Start \> All Programs \> Microsoft Exchange Server 2010** and click on the **Exchange Management Console** item. +3. Roll open the **Organization Configuration** list and select **Hub Transport**. +4. Click on **New Send Connector** in the Actions sidebar. +5. Name the Send Connector whatever you like and select Internet for the Intended Use pull-down. This allows for the integration with an authenticated SmartHost and adds the default send permissions required by Exchange 2010 to route messages through an external host that is not a part of the domain forest. +6. Click **Next**. +7. Click Add and specify the allowed address space to which the connector can send messages. If you want to send to anyone on the internet, then you would insert an "\*" in the Address field. If you want to send only to a specific domain, enter that domain. If you want to allow all sub-domains you can check the box, but I prefer to notate that literally like so: \*.SAMPLEDOMAIN.COM. Insert a high cost (100 is the top, so choose wisely) so that the connector is not used inadvertently. +8. Click **Next**. +9. On the Network Settings page, select the **Route mail through the following smart hosts** item. 10. Click **Add**. 11. Select the **Fully qualified domain name (FQDN)** item, and enter: *smtp.sendgrid.net* 12. Click **Next**. diff --git a/source/Integrate/Mail_Servers/iis75.md b/source/Integrate/Mail_Servers/iis75.md index 41c6bf44cf..dc57a0fdd0 100644 --- a/source/Integrate/Mail_Servers/iis75.md +++ b/source/Integrate/Mail_Servers/iis75.md @@ -7,62 +7,62 @@ navigation: --- {% info %} -This document was written using Windows Server 2008 R2 running IIS version 7.5 and ASP.NET scripting technology for sending email. Only basic authentication is supported in this document. If you require SSL/TLS, you will need to configure those elements separately. +This document was written using Windows Server 2008 R2 running IIS version 7.5 and ASP.NET scripting technology for sending email. If you require SSL/TLS, you will need to configure those elements separately. {% endinfo %} {% anchor h2 %} -IIS 7.5 Configuration +IIS 7.5 Configuration {% endanchor %} Before you get going, you'll need to set up IIS in order to support SendGrid integration. This tutorial assumes that you have set up a working site and that the root directory tests as valid. -1. Open IIS 7.0/7.5 Manager in Windows -2. Click on your site (see image below, noting that your configuration will look different), and the main configuration options page will be displayed to the right -3. Double-click on the "SMTP E-mail" under the ASP.NET section (to get the below screen) -4. In the email address field: type the email address that will be the "sender" -5. Click on the "Deliver e-mail to SMTP server" radio button if not already enabled -6. In the SMTP Server field: type localhost -7. In the Port field: type 25 -8. In Authentication Settings click the "Not required" option. -9. On the right side "Actions" pane: click Apply +1. Open IIS 7.0/7.5 Manager in Windows +2. Click on your site (see image below, noting that your configuration will look different), and the main configuration options page will be displayed to the right +3. Double-click on the "SMTP E-mail" under the ASP.NET section (to get the below screen) +4. In the email address field: type the email address that will be the "sender" +5. Click on the "Deliver e-mail to SMTP server" radio button if not already enabled +6. In the SMTP Server field: type localhost +7. In the Port field: type 25 +8. In Authentication Settings click the "Not required" option. +9. On the right side "Actions" pane: click Apply
-![](https://sendgrid.com/docs/images/iis_mgr_site.png) +![]({{root_url}}/images/iis_mgr_site.png "IIS Manager")
{% info %} -If you want to configure additional security to the localhost IIS 6.0 server you would set it here and match the same authentication in the IIS 6.0 GUI. +If you want to configure additional security to the localhost IIS 6.0 server you would set it here and match the same authentication in the IIS 6.0 GUI. {% endinfo %} {% anchor h2 %} -Enable SMTP Service: +Enable SMTP Service: {% endanchor %} -1. Go to Start \> All Programs \> Administrative Tools \> Server Manager -2. Click on the Features item in the navigation pane -3. Click the Add Features link to start the wizard -4. Scroll down the list to the SMTP Server, and check the box. The Required Role Services dialog will appear, listing all of the dependencies that the SMTP server depends on to operate. Click Add Require Role Services. -5. Click Next twice -6. Review the list of available IIS Role Services and check any that you would like to add -7. Click Next then click Install +1. Go to Start \> All Programs \> Administrative Tools \> Server Manager +2. Click on the Features item in the navigation pane +3. Click the Add Features link to start the wizard +4. Scroll down the list to the SMTP Server, and check the box. The Required Role Services dialog will appear, listing all of the dependencies that the SMTP server depends on to operate. Click Add Require Role Services. +5. Click Next twice +6. Review the list of available IIS Role Services and check any that you would like to add +7. Click Next then click Install Once the SMTP Server service is installed, the IIS 6.0 virtual server technology is activated, and the IIS 6.0 administration snap-in will now be active. {% anchor h2 %} -Configure IIS 6.0 to Relay Outbound Email to SendGrid +Configure IIS 6.0 to Relay Outbound Email to SendGrid {% endanchor %} -1. Go to Start \> All Programs \> Administrative Tools \> IIS 6.0 Manager -2. Right click on the SMTP Virtual Server \#1 and select the Properties option -3. Click the box to enable logging section to assist you in configuring the server -4. Click on Properties and check the box to activate Use Local Time For File Naming And Rollover option -5. Click on the Advanced tab and check the following items: Date, Time, Client IP Address, User Name, Service Name, Server Name, Server IP Address, Server Port, Method, Protocol Status, Bytes Sent, Protocol Version, and Host. -6. Click OK -7. Click on the Access tab the click the Relay button in the Relay Restrictions section -8. Click Add, enter 127.0.0.1, and click OK. The IP will appear in the list with Access Granted -9. Click OK Only The List Below radio button and enter 127.0.0.1 in the IP address field. +1. Go to Start \> All Programs \> Administrative Tools \> IIS 6.0 Manager +2. Right click on the SMTP Virtual Server \#1 and select the Properties option +3. Click the box to enable logging section to assist you in configuring the server +4. Click on Properties and check the box to activate Use Local Time For File Naming And Rollover option +5. Click on the Advanced tab and check the following items: Date, Time, Client IP Address, User Name, Service Name, Server Name, Server IP Address, Server Port, Method, Protocol Status, Bytes Sent, Protocol Version, and Host. +6. Click OK +7. Click on the Access tab the click the Relay button in the Relay Restrictions section +8. Click Add, enter 127.0.0.1, and click OK. The IP will appear in the list with Access Granted +9. Click OK Only The List Below radio button and enter 127.0.0.1 in the IP address field. 10. Click on OK to return to the Access tab as shown in the previous screenshots. 11. Select the Delivery tab and click the Outbound Security button 12. Click on Basic Authentication where the Username will be your SendGrid.com username and the password will be your SendGrid.com password @@ -72,11 +72,11 @@ Configure IIS 6.0 to Relay Outbound Email to SendGrid 16. Click on OK twice and you can close the IIS 6.0 admin MMC {% anchor h2 %} -Configure Domains +Configure Domains {% endanchor %} -At this point you will need to configure an SMTP domain that relays messages to SendGrid. Please follow [Microsoft's instructions](http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e2156172-7118-4ff2-9a6a-1b7dd52580fa.mspx?mfr=true). +At this point you will need to configure an SMTP domain that relays messages to SendGrid. Please follow [Microsoft's instructions](http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/e2156172-7118-4ff2-9a6a-1b7dd52580fa.mspx?mfr=true). {% anchor h2 %} -Testing Your New Configuration +Testing Your New Configuration {% endanchor %} First, let's test using Telnet. Open up a telnet client within Windows. You do that in the Command Prompt by entering the following: diff --git a/source/Integrate/Open_Source_Apps/drupal.md b/source/Integrate/Open_Source_Apps/drupal.md index 0bfcb2db7d..3ed5f4eb84 100644 --- a/source/Integrate/Open_Source_Apps/drupal.md +++ b/source/Integrate/Open_Source_Apps/drupal.md @@ -5,13 +5,13 @@ title: Drupal navigation: show: true --- -To send emails from Drupal using SendGrid, you may use the Sendgrid Integration module, the SMTP Authentication Support module, or the Swift Mailer module depending on your needs. +To send emails from Drupal using SendGrid, you may use the SendGrid Integration module, the SMTP Authentication Support module, or the Swift Mailer module depending on your needs. {% anchor h2 %} Using the SendGrid Integration Module {% endanchor %} -The SendGrid Integration Module uses the SendGrid API webservices to send email. It does not use SMTP. Depending on the workload of your website, this could be of benefit to you in performance. This module also provides charts for reports of vital statistcis. The module does require an advanced knowledge of Drupal in order to install and setup. Usage of Drush is required. +The SendGrid Integration Module uses the SendGrid API webservices to send email. It does not use SMTP. Depending on the workload of your website, this could be of benefit to you in performance. This module also provides charts for reports of vital statistics. The module does require an advanced knowledge of Drupal in order to install and setup. Usage of Drush is required. Download and install the [SendGrid Integration Module](https://www.drupal.org/project/sendgrid_integration "SendGrid Integration Module") from Drupal.org and perform updates via Drush with Composer Manger. @@ -32,7 +32,7 @@ Open your modules page, find the SMTP module, and configure it with the followin - **SMTP Server** - smtp.sendgrid.net - **SMTP Port** - 587 -- **Use Encrypted Protocal** - No. If you want encryption choose "Use SSL" and set SMTP Port to 465 +- **Use Encrypted Protocol** - No. If you want encryption choose "Use SSL" and set SMTP Port to 465 - **Username** - SendGrid Username - **Password** - SendGrid Password diff --git a/source/Integrate/Open_Source_Apps/joomla.md b/source/Integrate/Open_Source_Apps/joomla.md index cb29220e05..402180c0c2 100644 --- a/source/Integrate/Open_Source_Apps/joomla.md +++ b/source/Integrate/Open_Source_Apps/joomla.md @@ -8,7 +8,10 @@ navigation: Joomla supports sending email over SMTP. To have Joomla relay email through SendGrid go to *Site \> Global Configuration* and change: -- **SMTP Auth** - Yes +- **Mailer** – SMTP +- **SMTP Host** - smtp.sendgrid.net +- **SMTP Port** – 587 +- **SMTP Security** – STARTTLS +- **SMTP Authentication** - Yes - **SMTP User** - sendgrid_username - **SMTP Pass** - sendgrid_password -- **SMTP Host** - smtp.sendgrid.net diff --git a/source/Integrate/Partners/Amazon_Marketplace.md b/source/Integrate/Partners/Amazon_Marketplace.md index 1a2fa8f95e..f40541bab5 100644 --- a/source/Integrate/Partners/Amazon_Marketplace.md +++ b/source/Integrate/Partners/Amazon_Marketplace.md @@ -37,7 +37,7 @@ Managing your account - [Adding a Dedicated IP Address](#-Adding-a-Dedicated-IP-Address) - [Adding Subusers](#-Adding-Subusers) -- [Adding Domain and Link Whitelabels](#-Adding-Domain-and-Link-Whitelabels) +- [Adding domain authentication and link branding](#-Adding-domain-authentication-and-link-branding) - [Upgrading or Downgrading Your Account](#-Upgrading-or-Downgrading-Your-Account) - [Managing Billing Options](#-Managing-Billing-Options) - [Canceling Your SendGrid Subscription](#-Canceling-Your-SendGrid-Subscription) @@ -62,10 +62,10 @@ You can only add a Dedicated IP Address if you are on an AWS Pro plan. To upgrad 1. Click **Add**. {% anchor h3 %} -Adding Domain and Link Whitelabels +Adding domain authentication and link branding {% endanchor %} -Whitelabeling shows ISPs that SendGrid has your permission to send emails on your behalf. Whitelabeling works by pointing DNS entries from your domain registrar to SendGrid, which drastically increases your ability to deliver email and allows you to begin building a sender reputation for your domain and for your IP addresses. For more information, see [our guides on setting up Domain and Link whitelabels]({{root_url}}/User_Guide/Settings/Whitelabel/index.html) +Sender authentication shows email providers that SendGrid has your permission to send emails on your behalf. Domain authentication works by pointing DNS entries from your domain registrar to SendGrid, which drastically increases your ability to deliver email and allows you to begin building a sender reputation for your domain and for your IP addresses. For more information domain authentication , see [How to Set Up Domain Authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) {% anchor h3 %} Adding Subusers diff --git a/source/Integrate/Partners/Google.md b/source/Integrate/Partners/Google.md index 2ab0bf5dbf..739b67788f 100644 --- a/source/Integrate/Partners/Google.md +++ b/source/Integrate/Partners/Google.md @@ -23,4 +23,4 @@ Compute Engine If you're using Google's Compute Engine, click [here](https://cloud.google.com/compute/docs/sending-mail#sendgrid) -Check out our blog for more information on how to make Google and SendGrid work together [here]({{site.blog_url}}/?s=google+app+engine&submit=). +Check out our blog for more information on how to make Google and SendGrid work together [here]({{site.blog_url}}/?s=google+app+engine&submit=). diff --git a/source/Integrate/Partners/account-migration.md b/source/Integrate/Partners/account-migration.md new file mode 100644 index 0000000000..9ef60e6f75 --- /dev/null +++ b/source/Integrate/Partners/account-migration.md @@ -0,0 +1,92 @@ +--- +seo: + title: Migrating from a partner account + description: Sometimes if a SendGrid partner no longer supports SendGrid core functionality, you may want to migrate your account to a regular SendGrid account. + keywords: migrate, partner sunset +title: Migrating from a partner account +weight: 0 +layout: page +navigation: + show: true +--- + +If you are setting up a new account directly with SendGrid but have previously had an account through one of our partners, there are several things to keep in mind - make sure to stop sending mail until you migrate to a new, warmed up account, and make sure export data from your old account, and clean up the data described here so that you can import it into your new account. + +{% anchor h2 %} +Before you begin +{% endanchor %} + +- Pause sending email on your old account. +- Login to app.sendgrid.com with your current SendGrid username and password. + +{% anchor h2 %} +Update sender authentication +{% endanchor %} + +You cannot export and import sender authentication data - you need to set this up manually in your new account after you delete the current authentication records from your [DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html#-DNS) provider. + +If you have domain, link, and IP authentication set up, remove 5 CNAME or MX/TXT records and 1 A record from your domain’s DNS. To verify the records delete from your DNS, go to the [Sender Authentication page](https://app.sendgrid.com/settings/sender_auth) in the UI and check the DNS column: + +![]({{root_url}}/img/dns-records.jpg "Where to find your existing DNS records") + +To set up sender authentication in your new account, check out [Setting up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html), [Setting up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html), and [Setting up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html). + +{% anchor h2 %} +Migrate unsubscribes +{% endanchor %} + +To download your unsubscribes, on the [Global unsubscribes page](https://app.sendgrid.com/suppressions/global_unsubscribes), select the action menu, and then click **Download a CSV**. + +To set up your unsubscribes in your new account, copy them into the UI by going to [Global](https://app.sendgrid.com/suppressions/global_unsubscribes) or [Group](https://app.sendgrid.com/suppressions/group_unsubscribes) Unsubscribes page, selecting the action menu and then adding them to the list. You can add them with the API by using the [Suppressions methods](https://sendgrid.api-docs.io/v3.0/suppressions-global-suppressions/add-recipient-addresses-to-the-global-suppression-group) + +{% anchor h2 %} +Migrate templates +{% endanchor %} + +From the [Marketing Campaigns templates](https://sendgrid.com/marketing_campaigns/ui/marketing_templates) and the [Transactional templates](https://sendgrid.com/dynamic_templates) pages in the UI, export the HTML of any templates you want to migrate. + +To add your templates in the new account, navigate to either the [Marketing Campaigns templates](https://sendgrid.com/marketing_campaigns/ui/marketing_templates) or the [Transactional templates](https://sendgrid.com/dynamic_templates) page in the UI, create a new template, select to [use the code editor]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html), and paste the HTML of the exported template into the editor. + +{% anchor h2 %} +Migrate Marketing Campaigns Contacts +{% endanchor %} + +From the [Marketing Campaigns contacts](https://sendgrid.com/marketing_campaigns/ui/contacts) page, click into your [Global All Contacts](https://sendgrid.com/marketing_campaigns/ui/all_contacts) list. Then export a CSV of your contacts. + +To upload your contacts into your new account, from the [Contacts page](https://sendgrid.com/marketing_campaigns/ui/contacts), click **Add contacts** and then *Upload CSV*. + +{% anchor h2 %} +Review existing API keys +{% endanchor %} + +If you are using the SendGrid API, double check your accounts [list of API keys](https://app.sendgrid.com/settings/api_keys). API keys are not exportable, but it's good to make sure that you're aware of all of the existing API keys in your account so that you can create new ones to match in your new account and update your integrations with the new API keys. + +{% anchor h2 %} +Delete teammates +{% endanchor %} + +Teammate names have to be unique across SendGrid, so if you want to continue to use your teammate name, delete it from your original account to add it to your new account. + +{% anchor h2 %} +Create new subusers +{% endanchor %} + +If you are using subusers, navigate to the [subusers page](https://app.sendgrid.com/settings/subusers) in the UI and click **Export data** to download all of the information on your current subsuers. + +To add subusers to your new account, go to the [subusers page](https://app.sendgrid.com/settings/subusers) in the UI, and click **Create a new subuser**. Use the data from the exported CSV to create a new subuser. + +{% anchor h2 %} +Migrate dedicated IPs +{% endanchor %} + +If you are using a dedicated IP, our support team can migrate your dedicated IP for you. Access support contact options by logging into https://support.sendgrid.com. Provide us with: your current and new usernames, the IP addresses, and your preferred time for the IP transfer - we can migrate IPs between 7 am and 5 pm MST on Monday through Friday. + +Be sure to set up reverse DNS and rewarm up your transferred IP before you start sending on it in your new account. You also need to reassign it to subusers if needed. + +{% anchor h2 %} +Download stats and email activity +{% endanchor %} + +On all of the stats pages and on the email activity page, click **Export CSV** to download your stats for your records. Your new account cannot import this data. + + diff --git a/source/Integrate/Partners/magento.md b/source/Integrate/Partners/magento.md index b50f3784a2..2f205d8d70 100644 --- a/source/Integrate/Partners/magento.md +++ b/source/Integrate/Partners/magento.md @@ -16,7 +16,7 @@ This extension allows you to configure Magento 2.0 to send all emails using Send Description {% endanchor %} -The official SendGrid extension for Magento 2.0 makes it easy to ensure delivery of your most important transactional emails. Purchase receipts, shipping confirmations, and password reset emails are at the core of how you engage with your customers, helping to fuel your store’s growth. Email delivery is our passion. Entrust our industry-leading email delivery platform, including world-class deliverability tools and expertise to make sure your transactional emails get to the inbox. +The official SendGrid extension for Magento 2.0 makes it easy to ensure delivery of your most important transactional emails. Purchase receipts, shipping confirmations, and password reset emails are at the core of how you engage with your customers, helping to fuel your store’s growth. Email delivery is our passion. Entrust our industry-leading email delivery platform, including world-class deliverability tools and expertise to make sure your transactional emails get to the inbox. Transactional email is an important component of any email communication strategy. SendGrid relieves businesses of the cost and complexity of maintaining custom email systems. SendGrid provides reliable delivery, scalability and real-time analytics along with flexible APIs that make custom integration a breeze. SendGrid for Magento 2.0 allows you to choose between the SMTP relay or the Email API to send outgoing emails from your Magento installation. diff --git a/source/Integrate/Tutorials/CloudRail.md b/source/Integrate/Tutorials/CloudRail.md index eb0060175b..ccaec26114 100644 --- a/source/Integrate/Tutorials/CloudRail.md +++ b/source/Integrate/Tutorials/CloudRail.md @@ -66,7 +66,7 @@ final Profile profile = new Facebook(this, "[Client ID]", "[Client Secret]"); new Thread() { public void run() { - String userFullName = profile.getFullName(); // Implicitely triggers login + String userFullName = profile.getFullName(); // Implicitly triggers login String userEmail = profile.getEmail(); email.sendEmail( "[senderEmail]", diff --git a/source/Integrate/Tutorials/Formio.md b/source/Integrate/Tutorials/Formio.md index b0485ad8eb..b99e2b4e73 100644 --- a/source/Integrate/Tutorials/Formio.md +++ b/source/Integrate/Tutorials/Formio.md @@ -9,9 +9,9 @@ layout: page navigation: show: true --- -Form.io is a combined form and data management API platform created for developers who are building "Serverless" form-based applications. Form.io provides an easy drag-and-drop form builder workflow allowing you to build complex forms for enterprise applications quickly and easily. These forms are then embedded directly into your application with a single line of code that dynamically renders the form (using Angular or React) in your app while at the very same time generating the RESTful API to support those forms. The Form.io platform also offers numerous 3rd-party services that are fully integrated into the form building process allowing you to extend the power and capability of your apps while saving time and effort. +Form.io is a combined form and data management API platform created for developers who are building "Serverless" form-based applications. Form.io provides an easy drag-and-drop form builder workflow allowing you to build complex forms for enterprise applications quickly and easily. These forms are then embedded directly into your application with a single line of code that dynamically renders the form (using Angular or React) in your app while at the very same time generating the RESTful API to support those forms. The Form.io platform also offers numerous 3rd-party services that are fully integrated into the form building process allowing you to extend the power and capability of your apps while saving time and effort. -Form.io has recently announced the integration of Sendgrid’s API into their list of standard “Form Actions”, allowing you to extend your SendGrid email capabilities further into your apps, by automatically triggering emails through your SendGrid account when forms are submitted within your application. +Form.io has recently announced the integration of SendGrid’s API into their list of standard “Form Actions”, allowing you to extend your SendGrid email capabilities further into your apps, by automatically triggering emails through your SendGrid account when forms are submitted within your application. ![Form.io SendGrid integration]({{root_url}}/images/formio-sendgrid.png "Form.io SendGrid Integration") @@ -38,7 +38,7 @@ Once you have a Form.io project, the next step is to create an API KeySendGrid API Key provided to you when the API key was created. - Save your settings. -![Form.io SendGrid Settings]({{root_url}}/images/formio-settings.png "Form.io Sendgrid Settings") +![Form.io SendGrid Settings]({{root_url}}/images/formio-settings.png "Form.io SendGrid Settings") {% anchor h2 %} Adding an email action @@ -64,7 +64,7 @@ With this step complete, every user who registers for this application will rece Deploy your Serverless Application! {% endanchor %} -Now that your project is configured for SendGrid, you can deploy it in a number of different ways including GitHub Pages, Apache Cordova, Electron, etc. You can also preview your application by clicking on the Preview tab of your project. Since this application is "serverless" it can be hosted in a wide range of places and immediately connect your forms with Sendgrid! +Now that your project is configured for SendGrid, you can deploy it in a number of different ways including GitHub Pages, Apache Cordova, Electron, etc. You can also preview your application by clicking on the Preview tab of your project. Since this application is "serverless" it can be hosted in a wide range of places and immediately connect your forms with SendGrid! ![Form.io Launch]({{root_url}}/images/formio-launch.png "Form.io Launch") diff --git a/source/Integrate/Tutorials/Segment/sendgrid_source.md b/source/Integrate/Tutorials/Segment/sendgrid_source.md index c305f1654d..c267e81ebe 100644 --- a/source/Integrate/Tutorials/Segment/sendgrid_source.md +++ b/source/Integrate/Tutorials/Segment/sendgrid_source.md @@ -44,7 +44,7 @@ SendGrid has a single Event URL location. By using the SendGrid source, you will SendGrid has a sync component, which means we’ll make requests to their API on your behalf on a 3 hour interval to pull the latest data into Segment. In the initial sync, we’ll grab all the SendGrid objects (and their corresponding properties) according to the [Collections Table]() below. SendGrid objects will be written into a separate schema, corresponding to the source instance’s schema name you designated upon creation. -Our sync component gets resources from SendGrid and forwards them to Segment using an upsert API, so the dimensional data in your warehouse loaded will reflect the latest state of the corresponding resource in SendGrid. For example, if `lists.recipient_count` goes from `100` to `200` between syncs, on its next flush to your warehouse, that tickets status will be `200`. +Our sync component gets resources from SendGrid and forwards them to Segment using an upsert API, so the dimensional data in your warehouse loaded will reflect the latest state of the corresponding resource in SendGrid. For example, if `lists.recipient_count` goes from `100` to `200` between syncs, on its next flush to your warehouse, that tickets status will be `200`. ### Streaming diff --git a/source/Integrate/Tutorials/WindowsAzure.md b/source/Integrate/Tutorials/WindowsAzure.md index 2cf214461a..d23b77abd0 100644 --- a/source/Integrate/Tutorials/WindowsAzure.md +++ b/source/Integrate/Tutorials/WindowsAzure.md @@ -42,7 +42,7 @@ Connect to the SendGrid Inbound Parse API SendGrid can both send and receive email for your domain name. The playlist app uses incoming mail, which means setting up DNS at your domain registrar or host. The process to do this is going to be different depending on who controls your DNS. This tutorial will walk through the Azure and SendGrid part of this process, but you may need to ask for help on changing DNS in your system. -It’s a good idea to choose a subdomain like playlist.example.com, rather than a domain itself. That’s because the Inbound Parse API must collect all mail and you don’t want to interrupt other email for your domain. To use custom domains in Windows Azure, your website will need to run in either Shared mode or the Standard tier; however, Shared mode is currently not available. +It’s a good idea to choose a subdomain like playlist.example.com, rather than a domain itself. That’s because the Inbound Parse API must collect all mail and you don’t want to interrupt other email for your domain. To use custom domains in Windows Azure, your website will need to run in either Shared mode or the Standard tier; however, Shared mode is currently not available. Find your IP address and note the further instructions in the management portal: diff --git a/source/Integrate/Tutorials/WordPress/subscription_widget.md b/source/Integrate/Tutorials/WordPress/subscription_widget.md index 4a0396ec9e..570e50fc87 100644 --- a/source/Integrate/Tutorials/WordPress/subscription_widget.md +++ b/source/Integrate/Tutorials/WordPress/subscription_widget.md @@ -76,7 +76,7 @@ After you set up a valid API key you must choose a specific list where your new ![]({{root_url}}/images/wp_subscription_widget_2.png) -If you don't have a list set up for your signups from the Subscription Widget, open your SendGrid Dashboard, click on **Marketing Campaigns** in the sidebar, then select **Contacts** and [create a new list]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html). +If you don't have a list set up for your signups from the Subscription Widget, open your SendGrid Dashboard, click on **Marketing Campaigns** in the sidebar, then select **Contacts** and [create a new list]({{root_url}}/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.html). ![]({{root_url}}/images/wp_subscription_widget_2_1.png) diff --git a/source/Integrate/Tutorials/WordPress/wordpress_integration_faq.md b/source/Integrate/Tutorials/WordPress/wordpress_integration_faq.md index 2e81588cac..d14e30ee7e 100644 --- a/source/Integrate/Tutorials/WordPress/wordpress_integration_faq.md +++ b/source/Integrate/Tutorials/WordPress/wordpress_integration_faq.md @@ -70,7 +70,7 @@ function use_wpbe_template( $message, $content_type ) { add_filter( 'sendgrid_override_template', 'use_wpbe_template', 10, 2 ); {% endcodeblock %} -Using the default templates from WP Better Emails will cause all emails to be sent as HTML (i.e. content-type of text/html). In order to send emails as plain text (i.e. a content-type of text/plain) you should remove the HTML Template from WP Better Emails settings page. This is can be done by removing the `%content%` tag from the HTML template. +Using the default templates from WP Better Emails will cause all emails to be sent as HTML (i.e. content-type of text/html). In order to send emails as plain text (i.e. a content-type of text/plain) you should remove the HTML Template from WP Better Emails settings page. This is can be done by removing the `%content%` tag from the HTML template. {% anchor h2 %} Why are my emails sent as HTML instead of plain text? @@ -91,7 +91,7 @@ What permissions should my API keys have? For the API Key used for sending emails (the General tab): – Full Access to Mail Send. – Read Access to Stats. -– Read Access to Supressions > Unsubscribe Groups. +– Read Access to Suppressions > Unsubscribe Groups. – Read Access to Template Engine. For the API Key used for contact upload (the Subscription Widget tab): – Full Access to Marketing Campaigns. diff --git a/source/Integrate/Tutorials/Zapier/sending_for_new_webhook_data.md b/source/Integrate/Tutorials/Zapier/sending_for_new_webhook_data.md index f43a887493..598b9ae952 100644 --- a/source/Integrate/Tutorials/Zapier/sending_for_new_webhook_data.md +++ b/source/Integrate/Tutorials/Zapier/sending_for_new_webhook_data.md @@ -2,7 +2,7 @@ seo: title: Send Emails Through SendGrid For New Caught Webhook Data description: Learn how to receive a SendGrid email for a new Event Webhook post by using Zapier. - keywords: integate, tutorial, Event Webhook, SendGrid, Zapier + keywords: integrate, tutorial, Event Webhook, SendGrid, Zapier title: Send Emails Through SendGrid For New Caught Webhook Data weight: 0 layout: page diff --git a/source/Integrate/Tutorials/Zapier/sending_for_postgre_sql_row_matches.md b/source/Integrate/Tutorials/Zapier/sending_for_postgre_sql_row_matches.md index c42d435d14..b5db1e58b1 100644 --- a/source/Integrate/Tutorials/Zapier/sending_for_postgre_sql_row_matches.md +++ b/source/Integrate/Tutorials/Zapier/sending_for_postgre_sql_row_matches.md @@ -42,7 +42,7 @@ Click here to [Send SendGrid emails for new PostgreSQL custom query row matches] 4. Choose your SendGrid account from the list of accounts, or connect a new account. 5. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials). ![Credential entry](https://api.monosnap.com/rpc/file/download?id=gAajRq9wMKNTN4HyEKzAMosD71ifb8) -6. Using fields from PostgreSQL, create and customize the email message that the Zap will send. The required fields for this step are **To**, **From**, and **Subject**, but you may fill in further fields if you desire to do so. +6. Using fields from PostgreSQL, create and customize the email message that the Zap will send. The required fields for this step are **To**, **From**, and **Subject**, but you may fill in further fields if you desire to do so. ![Email creation](https://api.monosnap.com/rpc/file/download?id=PMa2LUCYaqGcvdy9pPUtMhtrUtp5nW) 7. Click **Save + Finish**. diff --git a/source/Integrate/Tutorials/Zapier/sending_when_new_firebase_child_records_added.md b/source/Integrate/Tutorials/Zapier/sending_when_new_firebase_child_records_added.md index d575ae106d..cf29df0568 100644 --- a/source/Integrate/Tutorials/Zapier/sending_when_new_firebase_child_records_added.md +++ b/source/Integrate/Tutorials/Zapier/sending_when_new_firebase_child_records_added.md @@ -41,7 +41,7 @@ Click here to [Send SendGrid email when new Firebase child records are added](ht 3. Enter the **Path to Data** that you wish for the Zap to watch for child records. ![Path to data](https://api.monosnap.com/rpc/file/download?id=ftCyfZYQCYwIxgDZ7m61vK9wcdU2F3) 4. Choose your account from the list of accounts, or connect a new account. -5. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials). +5. To connect your SendGrid account to Zapier for the first time, you will enter the credentials of an API/mail account. If you have not created this account, you can do so [here](https://sendgrid.com/credentials). ![Credential entry](https://api.monosnap.com/rpc/file/download?id=gAajRq9wMKNTN4HyEKzAMosD71ifb8) 6. Using fields from Firebase, create and customize the **To**, **From**, and **Subject** email message that the Zap will send. ![Email entry](https://api.monosnap.com/rpc/file/download?id=z8bVdXOXSPszyLTNfBf0lhSYrPMlcP) diff --git a/source/Integrate/Tutorials/analytics_with_keen_io.md b/source/Integrate/Tutorials/analytics_with_keen_io.md index 33c1517f22..c4af198586 100644 --- a/source/Integrate/Tutorials/analytics_with_keen_io.md +++ b/source/Integrate/Tutorials/analytics_with_keen_io.md @@ -9,7 +9,7 @@ layout: page navigation: show: true --- -The SendGrid [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html) lets you stream all [email events]({{root_url}}/User_Guide/email_activity.html#-Email-Events) directly to Keen IO for real-time analysis and long term raw storage. +The SendGrid [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html) lets you stream all [email events]({{root_url}}/User_Guide/email_activity.html#-Email-Events) directly to Keen IO for real-time analysis and long term raw storage. It only takes a couple of minutes to start streaming email event data from SendGrid to Keen IO and once you do you can start analyzing and visualizing your data in a whole bunch of different ways. @@ -43,7 +43,7 @@ Log into your SendGrid account, click on **Settings** from the left menu → Sel ``` https://api.keen.io/3.0/projects/YOUR_KEEN_PROJECT_ID/email/sendgrid/1.0?api_key=YOUR_KEEN_API_WRITE_KEY ``` -You can snag a prebuilt URL in Keen’s UI or make your own. +You can snag a prebuilt URL in Keen’s UI or make your own. In the settings, select the events you want to post to Keen IO (why not all of them?). To do this, under **Select Actions**, check **All**. @@ -67,10 +67,6 @@ To find it, visit your [Keen home screen](https://keen.io/home), select the proj ![SendGrid- Email Analytics App Dashboard Home]({{root_url}}/images/keen/sendgrid_email_analytics_dashboard_empty.png) -A report for **All of your Mail”** will be created automatically. You can see Delivered Rates, Unique Opens, Unique Clicks, Click Rates, Unsubscribe Rates, Bounces, and Number of Emails Marked as Spam. - -For each of these metrics, you can download a CSV of the detailed event data. Just click on any cell, and you’ll see a menu with the option to download a CSV. Learn who did or did not open an email for example, and with this list of email addresses you can build a more targeted user campaign. - {% anchor h4 %} Adding a Segment {% endanchor h4 %} @@ -78,7 +74,7 @@ Adding a Segment A segment will allow you to track a specific campaign or filter on a particular field like a customer ID. To create a segment, select “Add Segment” from the top left corner. The following pop-out menu will allow you to define your segment name, the date you’d like to look at, and, most importantly, select a property by which you’d like to measure the effectiveness of a campaign. {% info %} -This is explaining a different process from creating an [customer email segment]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html#-Create-a-Segment) in SendGrid +This is explaining a different process from creating an [customer email segment]({{root_url}}/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.html#-Creating-a-Segment) in SendGrid {% endinfo %} ![SendGrid- Email Analytics App Create a Segment]({{root_url}}/images/keen/sendgrid_create_a_segment.png) @@ -125,7 +121,7 @@ The report has fixed timeframe options, but that doesn’t mean that we stop sto Understanding User Behavior {% endanchor h4 %} -Each column in the the Analytics App represents a different user action and each column is a unique step. From left to right, the columns display the number of people that successfully make it through each event. The fewest number of users have successful delivered events, open events, clicked events, and then unsubscribe events. +Each column in the the Analytics App represents a different user action and each column is a unique step. From left to right, the columns display the number of people that successfully make it through each event. The fewest number of users have successful delivered events, open events, clicked events, and then unsubscribe events. ![SendGrid- Email Analytics App Funnel]({{root_url}}/images/keen/sendgrid_funnel.png) @@ -183,7 +179,7 @@ Once you’ve found the query you need, you can either copy the URL right from y *To create a dashboard*: -**Step 1: Save your query.** Create your query in the Explorer and click **Run**. After running the query, click **Save**. +**Step 1: Save your query.** Create your query in the Explorer and click **Run**. After running the query, click **Save**. ![Save Your Query]({{root_url}}/images/keen/sendgrid_saved_query.png) diff --git a/source/Integrate/Tutorials/event_kit.md b/source/Integrate/Tutorials/event_kit.md index ac589b3a95..d13dbb65d4 100644 --- a/source/Integrate/Tutorials/event_kit.md +++ b/source/Integrate/Tutorials/event_kit.md @@ -13,9 +13,9 @@ navigation: show: true --- -Sendgrid's [Event Notification]({{root_url}}/API_Reference/Webhooks/event.html) feature allows you to receive POST data for your email events such as Opens, Clicks, Deliveries, and much more. However, traditionally this feature requires that you set up a separate database on your own to receive and store this posted data. While highly customizable, this method can be development and time intensive. +SendGrid's [Event Notification]({{root_url}}/API_Reference/Webhooks/event.html) feature allows you to receive POST data for your email events such as Opens, Clicks, Deliveries, and much more. However, traditionally this feature requires that you set up a separate database on your own to receive and store this posted data. While highly customizable, this method can be development and time intensive. -Our open source Eventkit app alleviates the hassle of needing to set up an endpoint on your own domain, and provides a simple yet powerful user interface to view and sort your SendGrid event data. Check out the videos below to walk you through the setup and configuration of EventKit. +Our open source EventKit app alleviates the hassle of needing to set up an endpoint on your own domain, and provides a simple yet powerful user interface to view and sort your SendGrid event data. Check out the videos below to walk you through the setup and configuration of EventKit. ##[Click here](https://github.com/sendgrid/eventkit-rails) to visit the EventKit Github repository. diff --git a/source/Integrate/Tutorials/piesync.md b/source/Integrate/Tutorials/piesync.md new file mode 100644 index 0000000000..05d3c6c1c6 --- /dev/null +++ b/source/Integrate/Tutorials/piesync.md @@ -0,0 +1,91 @@ +--- +layout: page +weight: 0 +title: Sync your SendGrid contacts using PieSync +navigation: + show: true +seo: + title: Sync your SendGrid contacts using PieSync + description: Learn how to keep your SendGrid contacts in sync with 100+ other apps using PieSync + keywords: integrate, tutorial, contact sync, PieSync, Mailchimp, Zendesk, Salesforce, HubSpot, Quickbooks +--- + +Follow these steps to set up a sync: + +1. [Create a PieSync account](#-Create-a-PieSync-account) +2. [Select your apps](#Select-your-apps) +3. [Authorize your apps](#Authorize-your-apps) +4. [Set up your sync configuration](#Set-up-your-sync-configuration) + +{% anchor h2 %} +Create a PieSync account +{% endanchor %} + +Sign up for a PieSync account [here](https://app.piesync.com/). + +{% anchor h2 %} +Select your apps +{% endanchor %} + +Select Sendgrid and the app you would like to sync with from within the PieSync application. + +{% anchor h2 %} +Authorize your apps +{% endanchor %} + +To authorize, follow the steps as described and make sure you have your [API Key]({{root_url}}/User_Guide/Settings/api_keys.html) before getting started. + +![]({{root_url}}/img/piesync-api-key.png "Access your SendGrid API Key") + +If you have already authorized SendGrid account(s) in the past or have another PieSync integration, you can skip the first part of the authorization and choose from your **Conncted Accounts**. + +![]({{root_url}}/img/piesync-verify-api-key.png "Verify your SendGrid API Key") + +{% anchor h2 %} +Set up your sync configuration +{% endanchor %} + +From within the connection setup screen, you'll be able to manage the following: + +{% anchor h3 %} +Filters and actions +{% endanchor %} + +{% codeblock %} +[IF] Supported Conditions/Filters + ALREADY EXISTING IN APP YOU SYNC WITH + FIELD VALUES (INCLUDING CUSTOM FIELDS) +{% endcodeblock %} + +![]({{root_url}}/img/piesync-if-filters.png "Add if filters") + +{% codeblock %} +[THEN] Supported Actions + UPDATING FIELD VALUES (INCLUDING CUSTOM FIELDS) +{% endcodeblock %} + +![]({{root_url}}/img/piesync-then-filters.png "Add then filters") + +{% anchor h3 %} +Default Mapping +{% endanchor %} + +Depending on the other app you're syncing with, you'll see a number of standard SendGrid fields being mapped by default. For instance, in a connection with Google Contacts, the default field mapping looks like this: + +![]({{root_url}}/img/piesync-default-fields.png "Standard fields") + +{% anchor h3 %} +Customizable Field Mapping +{% endanchor %} + +You can custom map your SendGrid Custom Fields and any additional standard fields that aren't included in the default mapping yet. Remember, a mapping between two fields can only exist if the types of fields are compatible, and the particular compatibility will determine the direction of the mapping. See our documentation [Customizable Field Mapping](https://help.piesync.com/features/new-customizable-field-mapping) for more information. + +![]({{root_url}}/img/piesync-field-mapping.png "Field mapping") + +{% anchor h2 %} +Related links +{% endanchor %} + +- [Learn More](https://www.piesync.com/sendgrid/) +- [PieSync Help Desk](https://help.piesync.com/connector-apps/send-grid) +- [Free PieSync 14-day trial!](https://app.piesync.com/) diff --git a/source/Integrate/libraries.md b/source/Integrate/libraries.md index d2dc0d42a2..accb1ca5f8 100644 --- a/source/Integrate/libraries.md +++ b/source/Integrate/libraries.md @@ -63,6 +63,9 @@ Web API Libraries {% endanchor %} - [StrongGrid](https://github.com/Jericho/StrongGrid) *by Jeremie Desautels* - Strongly typed library (no dynamic types!) for working with SendGrid's v3 API. Available as a [nuget package](https://www.nuget.org/packages/StrongGrid/). This library also includes a parser for Events and Inbounce Email webhooks. +- [MinimalSendGrid](https://github.com/TanukiSharp/MinimalSendGrid) *by Sebastien Robert* - Minimal implementation of the SendGrid HTTP v3 API to send emails, compatible with .NET Standard 1.0 +- [SendGridSharp](https://github.com/shibayan/SendGridSharp) *by Tatsuro Shibamura* - SendGrid Client for C# (.NET 4.5) Simple interface, support to the new API, there is a feature that is not dependent on the System.Net.Mail. + {% anchor h3 %} Universal @@ -104,6 +107,12 @@ Groovy - [grails-sendgrid](http://github.com/aiten/grails-sendgrid) *by Antony Jones* - Grails framework plugin +{% anchor h3 %} +Haskell +{% endanchor %} + +- [sendgrid-v3](https://github.com/marcelbuesing/sendgrid-v3) *by Marcel Buesing* - Haskell package for sending Mails via the SendGrid v3 Mail API + {% anchor h3 %} Java {% endanchor %} @@ -116,9 +125,11 @@ Java JavaScript / Node.js {% endanchor %} -- [node-sendgrid-web](http://github.com/jesusabdullah/node-sendgrid-web) *by Joshua Holbrook* - Send emails via SendGrid using the JSON web API and the request module. +- [sendgrid-mailer](https://github.com/adamreisnz) *by Adam Reis* - JavaScript wrapper for the the official Sendgrid library. - [node-sendgrid](https://github.com/HerdHound/node-sendgrid) *by Branko Vukelick* - Generate X-SMTPAPI headers in node.js. - [node_subscription_widget](https://github.com/devchas/sendgrid_subscription_widget) *by Devin Chasanoff* - General purpose subscription widget created in node.js +- [loopback-sendgrid-connector](https://github.com/VMois/loopback-sendgrid-connector) *by Vladyslav Moisieienkov* - Simple Loopback connector for SendGrid Mail Service +- [sts-sendgrid](https://github.com/oritpersik) *by Orit Persik* - Easily use the SendGrid Web API via Node.js. {% anchor h3 %} Meteor @@ -130,8 +141,9 @@ Meteor Perl {% endanchor %} -- [sendgrid-perl](http://github.com/sendgrid/sendgrid-perl) *by SendGrid* - Perl library for the SendGrid API -- [WebService--SendGrid](http://github.com/majrmovies/WebService--SendGrid) *by Jonathan Lloyd* - Perl interface for SendGrid API +- [Email::SendGrid::V3](https://metacpan.org/pod/Email::SendGrid::V3) *by Grant Street Group Inc* - Perl library for the SendGrid v3 Web API +- [sendgrid-perl](http://github.com/sendgrid/sendgrid-perl) *by SendGrid* - Perl library for the SendGrid v2 API +- [WebService--SendGrid](http://github.com/majrmovies/WebService--SendGrid) *by Jonathan Lloyd* - Perl interface for SendGrid v2 API {% anchor h3 %} PHP @@ -145,16 +157,20 @@ PHP - [codeigniter-sendgrid-mail](http://github.com/bold/codeigniter-sendgrid-mail) *by Garrett St John* - CodeIgniter wrapper for the SendGrid Mail API - [sendgrid-component](http://github.com/damusnet/sendgrid-component) *by Damien Varron* - CakePHP component that extends the base email component with SendGrid functionality - [sendgrid-subuser-api](https://github.com/eliksir/sendgrid-subuser-api) *by Eliksir* - Library that makes it easy to work with the SendGrid Subuser API -- [sendgrid-webapi-v3-php](https://github.com/idimensionz/sendgrid-webapi-v3-php) *by iDimensionz* - A complete implementation of the V3 WebAPI in PHP. Very structured, OO implementation with excellent test coverage. A repo containing examples showing how simple it is to utilize our implementation is available at [example](https://github.com/idimensionz/sendgrid-webapi-v3-examples). +- [sendgrid-webapi-v3-php](https://github.com/idimensionz/sendgrid-webapi-v3-php) *by iDimensionz* - A complete implementation of the V3 WebAPI in PHP. Very structured, OO implementation with excellent test coverage. A repo containing examples showing how simple it is to utilize our implementation is available at [example](https://github.com/idimensionz/sendgrid-webapi-v3-examples). - [laravel-sendgrid-driver](https://github.com/s-ichikawa/laravel-sendgrid-driver) *by Shingo Ichikawa* - This liblary can add sendgrid driver into the laravel's mail configure. +- [godpod/sendgrid](https://packagist.org/packages/godpod/sendgrid) *by Ravi Rajendra* - This library allows you to quickly and easily send emails or make api calls through SendGrid using PHP. +- [fastglass/sendgrid](https://github.com/taz77) *by taz77* - This library allows you to send emails through SendGrid using PHP and Guzzle 6.x. {% anchor h3 %} Python {% endanchor %} - [greplin-tornado-sendgrid](https://github.com/Cue/greplin-tornado-sendgrid) *by Daniel Gross* - SendGrid client for Tornado Web Server -- [django-sendgrid](https://github.com/RyanBalfanz/django-sendgrid) *by Ryan Balfanz* - SendGrid SMTP API interface for Django +- [django-sendgrid-v5](https://github.com/sklarsa/django-sendgrid-v5/) *by Steven Sklar* - SendGrid Web API Email Backend for Django - [sendgrid-django](https://github.com/elbuo8/sendgrid-django) *by Yamil Asusta* - SendGrid Web API interface for Django +- [Flask-SendGrid](https://github.com/frankV/flask-sendgrid) *by Frank Valcarcel* - SendGrid SMTP API interface for Flask +- [aiohttp-sendgrid](https://github.com/Kurlov/aiohttp-sendgrid) *by Aleksandr Kurlov* - SendGrid SMTP API interface for aiohttp {% anchor h3 %} Ruby @@ -196,7 +212,7 @@ Python {% endanchor %} - [Django eventhooks](https://github.com/agiliq/sendgrid-eventhooks) *by agiliq* - An app to consume and store SendGrid Events with Django -- [Pyramid Webhooks](https://github.com/GoodRx/pyramid-sendgrid-webhooks) *by GoodRx* - Parses incoming Sendgrid Webhook events in Pyramid apps +- [Pyramid Webhooks](https://github.com/GoodRx/pyramid-sendgrid-webhooks) *by GoodRx* - Parses incoming SendGrid Webhook events in Pyramid apps {% anchor h3 -Ruby-Webhooks %} Ruby diff --git a/source/Release_Notes/release_notes.md b/source/Release_Notes/release_notes.md deleted file mode 100644 index d98c5a8256..0000000000 --- a/source/Release_Notes/release_notes.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: page -weight: 100 -title: Release Notes -seo: - title: SendGrid Release Notes - description: The new features and changes to SendGrid - keywords: release notes -navigation: - show: true ---- -The following new features and changes to the service are available. - -{% anchor h2 %} -5 September 2017 -{% endanchor %} - -{% anchor h3 %} -Amazon Marketplace -{% endanchor %} - -SendGrid is now available on the [AWS Marketplace](https://aws.amazon.com/marketplace/pp/B074CQY6KB)! AWS customers are now able to integrate SendGrids email infrastructure and email marketing tools with their other AWS tools. For more information, see the [blog](https://aws.amazon.com/blogs/apn/inside-sendgrids-expanded-relationship-with-aws/) and the [documentation](https://sendgrid.com/docs/Integrate/Partners/Amazon_Marketplace.html). \ No newline at end of file diff --git a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/Migrating_API.md b/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/Migrating_API.md deleted file mode 100644 index c4a72d7a5b..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/Migrating_API.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -layout: page -weight: 0 -seo: - title: How to migrate from SendGrid Legacy Newsletter to Marketing Campaigns - description: -title: Migrating Your API Integrations -navigation: - show: true ---- - -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - -If you have integrations with the Legacy Newsletter API, you’ll need to change your code to use the Marketing Campaigns API. We have mapped every endpoint available in Legacy Newsletter to the comparative endpoint in Marketing Campaigns, in our API Reference. - -

Categories

- - - - -

Emails

- - - -

Lists

- - - - -

Marketing Emails

- - - - -

Recipients

- - - -

Schedule

- - - - -

Sender Address

- - - - -

Variations

- -There is currently no way to migrate variations to Marketing Campaigns using the API. diff --git a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.md b/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.md deleted file mode 100644 index d87c68c838..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.md +++ /dev/null @@ -1,303 +0,0 @@ ---- -layout: page -weight: 50 -seo: - title: Legacy Newsletter to Marketing Campaigns API Migration - description: -title: Migrating Using API Calls -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - -Before attempting to migrate your content, please review our [Migration Toolkit](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter//Migration_Tutorials/index.html). Then, using our API as described below, you can automate a portion of the process. We are giving all of our examples in curl, but the steps should translate to whichever language you used to build your application. - -{% anchor h2 %} -Table of Contents -{% endanchor %} - -* [Migrate Your Legacy Newsletter Content](#-Migrate-Your-Legacy-Newsletter-Content) - * [Retrieve all newsletters](#-Retrieve-all-newsletters) - * [Retrieve newsletter content](#-Retrieve-newsletter-content) - * [Import newsletter content into Marketing Campaigns](#-Import-newsletter-content-into-Marketing-Campaigns) -* [Migrate Your Legacy Newsletter Recipient Lists](#-Migrate-Your-Legacy-Newsletter-Recipient-Lists) - * [Retrieve all recipient lists](#-Retrieve-all-recipient-lists) - * [Retrieve recipient names and email addresses](#-Retrieve-recipient-names-and-email-addresses) - * [Create Marketing Campaigns contact lists](#-Create-Marketing-Campaigns-contact-lists) - * [Import Legacy Newsletter recipients into Marketing Campaigns](#-Import-Legacy-Newsletter-recipients-into-Marketing-Campaigns) - * [Add contacts to new lists](#-Add-contacts-to-new-lists) - -{% anchor h2 %} -Migrate Your Legacy Newsletter Content -{% endanchor %} - -{% anchor h3 %} -Retrieve all newsletters -{% endanchor %} - -Before you can migrate all of your marketing email content from Legacy Newsletter into Marketing Campaigns, you must first collect the name of every newsletter in your account. - -You will use this list of names to retrieve the content of those newsletters. - -{% anchor h4 %} -Request -{% endanchor %} - -{% codeblock lang:bash %} -curl https://api.sendgrid.com/api/newsletter/list.json -F api_user=SENDGRID_USERNAME -F api_key=SENDGRID_PASSWORD -{% endcodeblock %} - -{% anchor h4 %} -Response -{% endanchor %} - -{% codeblock lang:json %} -[ - { - "name": "Legacy Newsletter", - "newsletter_id": 560308 - }, - { - "name": "Legacy Newsletter Test", - "newsletter_id": 560869 - } -] -{% endcodeblock %} - -{% anchor h3 %} -Retrieve newsletter content -{% endanchor %} - -Now that you have a list of your newsletters, use the following request to retrieve the content of those newsletters. - -{% anchor h4 %} -Request -{% endanchor %} - -{% codeblock lang:bash %} -curl https://api.sendgrid.com/api/newsletter/get.json -F name="Legacy Newsletter" -F api_user=SENDGRID_USERNAME -F api_key=SENDGRID_PASSWORD -{% endcodeblock %} - -{% anchor h4 %} -Response -{% endanchor %} - -{% codeblock lang:json %} -{ - "can_edit": false, - "content_preview": 0, - "date_schedule": null, - "subject": "subject from Legacy Newsletter", - "text": "text content from Legacy Newsletter", - "html": "html content from Legacy Newsletter", - "timezone_id": 16, - "total_recipients": 1, - "type": "html", - "winner_sending_time": null -} -{% endcodeblock %} - -{% anchor h3 %} -Import newsletter content into Marketing Campaigns -{% endanchor %} - -Take the exported content from the previous API call and import it into Marketing Campaigns using the following API call. - -{% anchor h4 %} -Request -{% endanchor %} - -{% codeblock lang:bash %} -curl --request POST \ - --url https://api.sendgrid.com/v3/campaigns \ - --header 'accept: application/json' \ - --header 'authorization: Bearer SENDGRID_API_KEY' \ - --header 'content-type: application/json' \ - --data '{"title":"Legacy Newsletter","subject":"subject from Legacy Newsletter","html_content":"html content from Legacy Newsletter", "plain_content":"text content from Legacy Newsletter"}' -{% endcodeblock %} - -{% anchor h4 %} -Response -{% endanchor %} - -{% codeblock lang:json %} -{ - "id": 1, - "title": "Name of newsletter", - "ip_pool": "", - "categories": [], - "plain_content": "", - "html_content": "html content from Legacy Newsletter", - "subject": "subject from Legacy Newsletter", - "sender_id": null, - "list_ids": [], - "segment_ids": [], - "suppression_group_id": null, - "custom_unsubscribe_url": "", - "status": "Draft" -} -{% endcodeblock %} - -Now, you can use the [Marketing Campaigns API]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/campaigns.html#Update-a-Campaign-PATCH) or the [SendGrid UI](https://sendgrid.com/marketing_campaigns/ui/campaigns) to make further changes to your campaign. - -{% anchor h2 %} -Migrate Your Legacy Newsletter Recipient Lists -{% endanchor %} - -Before attempting to migrate your recipient lists, please review our [Migrating Recipient Lists tutorial]({{root_url}}/User_Guide/Legacy_Newsletter//Migration_Tutorials/migrating_recipient_lists.html). Then, using our API as described below, you can automate a portion of the process. - -{% anchor h3 %} -Retrieve all recipient lists -{% endanchor %} - -First, collect all of your Legacy Newsletter recipient lists. - -{% anchor h4 %} -Request -{% endanchor %} - -{% codeblock lang:bash %} -curl https://api.sendgrid.com/api/newsletter/lists/get.json -F api_user=SENDGRID_USERNAME -F api_key=SENDGRID_PASSWORD -{% endcodeblock %} - -{% anchor h4 %} -Response -{% endanchor %} - -{% codeblock lang:json %} -[ - { - "id": 1, - "list": "Legacy Newsletter list of recipients" - } -] -{% endcodeblock %} - -{% anchor h2 %} -Retrieve recipient names and email addresses -{% endanchor %} - -Next, get a list of emails and names that belong to each recipient list retrieved in the previous step. - -{% anchor h4 %} -Request -{% endanchor %} - -{% codeblock lang:bash %} -curl https://api.sendgrid.com/api/newsletter/lists/email/get.json -F list="Legacy Newsletter list of recipients" -F api_user=SENDGRID_USERNAME -F api_key=SENDGRID_PASSWORD -{% endcodeblock %} - -{% anchor h4 %} -Response -{% endanchor %} - -{% codeblock lang:json %} -[ - { - "email": "dx@sendgrid.com", - "name": "SendGrid DX Team" - } -] -{% endcodeblock %} - -{% anchor h3 %} -Create Marketing Campaigns contact lists -{% endanchor %} - -It is important to create individual contact lists in Marketing Campaigns that match the different recipient lists you created in Legacy Newsletter. This allows you to seamlessly move your recipients into Marketing Campaigns. - -Use the list names you retrieved in the first step to create new contact lists in Marketing Campaigns. - -{% anchor h4 %} -Request -{% endanchor %} - -{% codeblock lang:bash %} -curl --request POST \ - --url https://api.sendgrid.com/v3/contactdb/lists \ - --header 'accept: application/json' \ - --header 'authorization: Bearer SENDGRID_API_KEY' \ - --header 'content-type: application/json' \ - --data '{"name":" list of recipients"}' -{% endcodeblock %} - -{% anchor h4 %} -Response -{% endanchor %} - -{% codeblock lang:json %} -{ - "id": 1, - "name": " list of recipients", - "recipient_count": 0 -} -{% endcodeblock %} - -{% anchor h3 %} -Import Legacy Newsletter recipients into Marketing Campaigns -{% endanchor %} - -Before you can assign contacts to your individual lists, you must first do a bulk import of your Legacy Newsletter recipients to your default Marketing Campaigns contact list. - -Save the `persisted_recipient` values, as these map to the `list_id` in the following API call. - -{% anchor h4 %} -Request -{% endanchor %} - -{% codeblock lang:bash %} -curl --request POST \ - --url https://api.sendgrid.com/v3/contactdb/recipients \ - --header 'accept: application/json' \ - --header 'authorization: Bearer SENDGRID_API_KEY' \ - --header 'content-type: application/json' \ - --data '[{"email":"dx@sendgrid.com", "name":"SendGrid DX Team"},{"email":"dx+test@sendgrid.com", "name":"SendGrid DX Team Test Email"}]' -{% endcodeblock %} - -{% anchor h4 %} -Response -{% endanchor %} - -{% codeblock lang:json %} -{ - "new_count": 2, - "persisted_recipients": [ - "YUBh", - "YUBhYUBh" - ] -} -{% endcodeblock %} - -{% anchor h3 %} -Add contacts to new lists -{% endanchor %} - -Now that you have imported all of your Legacy Newsletter recipients into your default Marketing Campaigns contact list, you can assign different contacts to their respective lists. - -To ensure that each contact is added to the correct list, use the `persisted_recipient` value from the previous call. This value maps directly to the `list_id` used to identify contact lists in Marketing Campaigns. - -{% anchor h4 %} -Request -{% endanchor %} - -{% codeblock lang:bash %} -curl --request POST \ - --url https://api.sendgrid.com/v3/contactdb/lists/1/recipients \ - --header 'accept: application/json' \ - --header 'authorization: Bearer SENDGRID_API_KEY' \ - --header 'content-type: application/json' \ - --data '["YUBh","YUBhYUBh"]' -{% endcodeblock %} - -{% anchor h4 %} -Response -{% endanchor %} - -{% codeblock lang:bash %} -HTTP/1.1 201 -{% endcodeblock %} diff --git a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/downloading_historical_statistics.md b/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/downloading_historical_statistics.md deleted file mode 100644 index 15b82edae9..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/downloading_historical_statistics.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: page -weight: 60 -seo: - title: Downloading Historical Statistics - description: -title: Downloading Historical Statistics -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - -Begin by navigating to your Legacy Newsletter dashboard. - -Go to **Marketing Email** and click **Manage** to view the statistics for your newsletters. - -Here you will find a quick preview of your newsletter engagement and delivery metrics such as: - -* Sent -* Opens -* Open Rate -* Unique Opens -* Unique Open Rate -* Total Clicks -* Click-Through Rate (CTR) -* Total Click-Through Rate (TCTR) -* Opt-Out or Unsubscribe Rate -* Spam Reports - -To save and download statistics for future reference, simply use the checkboxes to select one or more campaigns that you are interested and click **Download CSV**. - -For more information about Legacy Newsletter statistics and analytics, click [here]({{root_url}}/User_Guide/Legacy_Features/Marketing_Emails/analytics.html). - -![]({{root_url}}/images/download_historical_stats.gif) diff --git a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/index.html b/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/index.html deleted file mode 100644 index 9eea6e94a3..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/index.html +++ /dev/null @@ -1,63 +0,0 @@ ---- -layout: page -weight: 100 -seo: - title: Migration Tutorials - description: -title: Migration Tutorials -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -

For assistance please contact our support team. Login to see your contact options.

- - - -
-
-

Migrating Your Content

-

- Marketing Campaigns offers a library of responsive templates as well as an easy-to-use campaign builder. However, if you have templates in Legacy Newsletter that you’d like to reuse in Marketing Campaigns, here’s a step-by-step migration guide. -

-
-
- -
-
-

Migrating Your Images

-

- The Marketing Campaigns image library makes it easy to upload and manage your images. Here you can learn how to seamlessly migrate your images from Legacy Newsletter to Marketing Campaigns. -

-
-
- -
-
-

Migrating Your Recipient Lists

-

- Moving your Legacy Newsletter recipients to the Marketing Campaigns platform is an important part of the migration process. Here you will find detailed step-by-step instructions explaining exactly how to migrate your recipients. -

-
-
- -
-
-

Migrating Your Unsubscribes

-

- To continue to seamlessly honor the subscription preferences of your recipients as you migrate from Legacy Newsletter to Marketing Campaigns, you’ll need to manually migrate your Legacy Newsletter unsubscribes. Here you will find instructions on how to migrate these subscription preferences. -

-
-
- -
-
-

Downloading Historical Statistics

-

- Before you complete the migration process, you may want to save your historical statistics from Legacy Newsletter. Here you will find a quick guide explaining how to download and store these statistics for future reference. -

-
-
diff --git a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_content.md b/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_content.md deleted file mode 100644 index 1cad862c9e..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_content.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -layout: page -weight: 70 -seo: - title: Migrating Content - description: -title: Migrating Content -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - - - -Marketing Campaigns offers a library of responsive templates as well as an easy-to-use campaign builder. However, if you have templates in Legacy Newsletter that you’d like to reuse in Marketing Campaigns, here’s a step-by-step migration guide. - -Begin by navigating to Legacy Newsletter. - -Go to **Marketing Email** and click **Manage**. - -First, we'll walk through the process of migrating content created using HTML in the Code Editor. Then, we will explain how to migrate content created using either the Drag & Drop Editor or Basic Templates. - -{% anchor h2 %} -Migrating Content Created in the Code Editor -{% endanchor %} - -Mouse over the email that you want to migrate content from and click Edit. - -This will take you to the Design section of Legacy Newsletter where you normally create and edit your newsletters. - -First, you want to download any images that you've included in your newsletter. To successfully migrate all of your content, you’ll need to begin by manually migrating your images: - -Hover your mouse over the image you want to migrate, and click the pencil shaped edit button. - -Right click on the image and select "Save image as…" to download the image to your computer. - -Repeat this process for each image that you want to migrate into Marketing Campaigns - -Next, select all of the HTML for your newsletter and copy it to your clipboard or a plain text editor. - -Navigate to **Marketing Campaigns** and click **Templates**. Click **Create a New Template**, give it a name, and click the **Code** toggle switch. Delete the example HTML that's displayed and paste in your copied HTML from Legacy Newsletter. - -{% warning %} -After pasting your copied HTML into the Marketing Campaigns code editor, do not toggle into the design editor. Continue updating your tags and adding your images within the code editor to ensure that the formatting of your template remains consistent. -{% endwarning %} - -Next, you need to update any tags that you used in your newsletter template to match the tags used by Marketing Campaigns. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Legacy Newsletter TagMarketing Campaigns Tag
[%from_name%][Sender_Name]
[%address%][Sender_Address]
[%city%][Sender_City]
[%state%][Sender_State]
[%zip%][Sender_Zip]
[weblink][Weblink]
[unsubscribe][Unsubscribe]
[Unsubscribe_Preferences]*
- -\* _Unsubscribe preferences is only available in Marketing Campaigns and allows your recipients to opt into, or out of, specific types of content. For more info on the [unsubscribe_preferences] tag, click [here]({{root_url}}/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html#-Manage-Email-Preferences-Links). For more general information about all of these tags, click [here]({{root_url}}/Classroom/Basics/Marketing_Campaigns/default_mc_tags.html)._ - -Once you have updated any tags included in your campaign, you'll want to make sure that you upload the images that you downloaded from Legacy Newsletter into your Marketing Campaigns image library. - -When viewing your new campaign, click the small image icon on the toolbar to open your image library. - -![]({{root_url}}/images/tool_bar_images.png) - -Click the large green plus button to begin uploading your saved images. - -Once you've finished uploading all of your images, simply insert them into your campaign. We recommend previewing your campaign using the preview buttons at the top of the editor to ensure that your campaign displays properly for desktop, mobile, and text-only viewers. - -Finally, click **Save**. Whenever you create a new campaign in Marketing Campaigns, this template will now be displayed as an option for you to use. - -{% anchor h2 %} -Migrating Content Created Using Basic Templates or the Drag & Drop Editor -{% endanchor %} - -There are three possible options for migrating content from Legacy Newsletter that was created using Basic Templates or the Drag & Drop Editor. - -1. **Fresh Start:** Recreate your newsletter from scratch in Marketing Campaigns using the new Drag & Drop Editor. -2. **Quick and Dirty:** Send yourself a test newsletter, copy the source code of the newsletter, and paste that code into Marketing Campaigns. -3. **Technical:** Leverage the Legacy Newsletter and Marketing Campaigns API to retrieve your content from Legacy Newsletter and post that content to Marketing Campaigns. - -{% anchor h3 %} -Fresh Start -{% endanchor %} - -You might decide to take this opportunity to refresh your content by recreating it in the Marketing Campaigns Drag & Drop editor. - -Navigate to **Marketing Campaigns**, select **Templates**, and click **Create New**. - -After naming your new campaign, toggle the Drag & Drop editor to **On**. This will present you with a **Build** tab where you can view each of the modules needed to create a beautiful and engaging campaign. [Click here]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html) for more instructions on how to use the Drag & Drop editor. - -{% anchor h3 %} -Quick and Dirty -{% endanchor %} - -Navigate to **Legacy Newsletter** and click **Manage**. Find the newsletter that you want to migrate, hover over that newsletter and click **Edit**. - -Since this newsletter was created using either Basic Templates or the Drag & Drop editor, we can't immediately view the source code from the designer. In order to view the source code, we'll have to send ourselves a test version of this newsletter. - -Click **Send a Test** and enter your email address. - -Once you see the newsletter appear in your inbox, open it and view the source code. - -For example, to accomplish this using Gmail, click **View Original** and select and copy all of the text beginning and ending with the `` tag. Paste this code into Marketing Campaigns according to the steps described in the first half of this article. - -Once delivered to your inbox, the content of your email will be encoded as Quoted-Printable text, and must be decoded before you paste it into Marketing Campaigns in order to maintain the original formatting. - -Decoding your campaign is simple. Simply paste all of the text beginning and ending with the tag that you copied from your inbox into an [online decoder](http://www.motobit.com/util/quoted-printable-decoder.asp) and click **Decode the source data**. Then you can paste the outputted text into Marketing Campaigns. - -![]({{root_url}}/images/decode_quoted_printable.gif) - -Again, please make sure that you re-host your images in the Marketing Campaigns image library and update any of your old Legacy Newsletter tags to match the tags used by Marketing Campaigns. - -{% anchor h3 %} -Technical -{% endanchor %} - -A third and slightly more technical option for you to consider is using an application called [Postman](https://www.getpostman.com/) to leverage SendGrid's [Legacy Newsletter API]({{root_url}}/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/index.html) and [Marketing Campaigns API]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/index.html) to pull content from Legacy Newsletter to be "posted" to Marketing Campaigns. diff --git a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_images.md b/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_images.md deleted file mode 100644 index 1e6e6710b5..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_images.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -layout: page -weight: 70 -seo: - title: Migrating Images - description: -title: Migrating Images -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - - - -{% anchor h2 %} -Download Images From Legacy Newsletter -{% endanchor %} - -Begin by navigating to Legacy Newsletter. - -Go to **Marketing Email** and click **Manage**. - -Next, hover your cursor over any newsletter that you have used in the past. It doesn't matter what status the newsletter is in. Click **Edit**. - -Ensure that you are on the **Design** step and scroll down until you see the **Image Library** in the right hand sidebar. - -Right click on each image in the library that you want to migrate to Marketing Campaigns and click "Save as…" - -Name your image and click **Save**. - -{% anchor h2 %} -Upload Images to Marketing Campaigns -{% endanchor %} - -From the Legacy Newsletter dashboard, navigate back to Marketing Campaigns by clicking your account name in the upper right hand corner and selecting **Account Overview**. - -Under **Marketing Campaigns** in the left hand sidebar, select **Templates**. - -Click **Create New Template**. - -Once you are in the Design Editor, click the image icon in the toolbar. From the modal window that opens, click the **Upload** button to select the images you wish to upload to the Marketing Campaigns image library. - -Alternatively, you can click the green **+** button and either click the grey box to upload your images, or drag and drop your images into the gray box. - -{% info %} -You can select multiple images to upload at once. -{% endinfo %} - -![]({{root_url}}/images/upload_images.gif) diff --git a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_recipient_lists.md b/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_recipient_lists.md deleted file mode 100644 index 3a992e7876..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_recipient_lists.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -layout: page -weight: 90 -seo: - title: Migrating Recipient Lists - description: -title: Migrating Recipient Lists -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - - - -{% anchor h2 %} -Exporting Your Lists from Legacy Newsletter -{% endanchor %} - -{% info %} -Please note that Legacy Newsletter refers to the individuals you send your marketing emails to as **recipients** whereas Marketing Campaigns refers to them as **contacts**. -{% endinfo %} - -While you cannot automatically migrate your Legacy Newsletter recipient lists into Marketing Campaigns, the manual migration process is quite simple. - -Navigate to the Legacy Newsletter by clicking **Marketing** on the SendGrid dashboard, then clicking **Legacy Newsletter**. - -Click **Recipients** and select **Manage** to see a list of your current Legacy Newsletter lists. - -Locate the recipient list that you want to migrate, hover over this list with your cursor to view possible actions, and click **Export** from the list that appears. - -Uncheck all options except for **Usable Emails**, since we only want to export valid email addresses. - -Tip: You can uncheck **Email Address Type** to deselect all options, then simply recheck **Usable Emails**. - -{% info %} -Your Legacy Newsletter unsubscribes are not automatically migrated when you move your recipient lists. You will need to [migrate your unsubscribes]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_unsubscribes.html) from Legacy Newsletter to Marketing Campaigns as a separate step. -{% endinfo %} - -Finally, click **Export** to begin downloading your list. Remember that if your list is quite large, this process may take several minutes. - -![]({{root_url}}/images/export_recipient_lists.gif) - -{% anchor h2 %} -Preparing Your List for Marketing Campaigns -{% endanchor %} - -In order for your Legacy Newsletter recipient list to successfully upload to Marketing Campaigns, you need to properly format the column headers in the first row of your .csv file. - -Column headers will become the custom fields you can leverage to power segmentation or to personalize your emails. Custom fields can be formatted as text, number, or date fields as described below. - -{% info %} -Custom Fields can be added, edited, or deleted with the Marketing Campaigns interface after they've been uploaded. -{% endinfo %} - -First, there are three reserved custom fields that require specific formatting for the column header: - -**Email** (required column) - -* The column containing all of your recipient email addresses must have the column header "email". - -**First name** (optional column) - -* The column header containing your recipients’ first names must be formatted as either First_Name, FName, First-Name, First Name, or FirstName - -**Last name** (optional column) - -* The column header containing your recipients’ last names must have be formatted as either Last_Name, LName, Last-Name, Last Name, or LastName - -{% info %} -Please note that these fields are not capitalization-sensitive. -{% endinfo %} - -All other fields must be formatted either as text, number, or date fields. - -Text fields must only contain letters A-Z, numbers 0-9, spaces, and underscores. Any special characters such as accent marks or pound signs will need to be removed or updated. - -Number fields can **ONLY** contain numbers, either as integers or decimals. No dashes, slashes, spaces, letters, or any other punctuation marks. This requirement makes it possible to employ powerful conditional logic (ie, “is greater than”) to create dynamic segments of your recipients. - -Date fields must match one of the following formats: - -* MM/DD/YYYY -* MM/D/YYYY -* M/D/YYYY -* M/DD/YYYY - -{% warning %} -Date fields **must** include all four digits of the year. -{% endwarning %} - -Once you have ensured that each of the above conditions is met, save your list as a .csv file. - -**You must save your list as a .csv file, not a .xls file!** - -{% anchor h2 %} -Uploading Your List to Marketing Campaigns -{% endanchor %} - -To upload your properly formatted .csv file to Marketing Campaigns, navigate to your SendGrid dashboard by clicking on your **Account Name** in the upper right hand corner of the Legacy Newsletter interface and select **Account Overview**. - -From your SendGrid Dashboard, click **Marketing** and select **Contacts** under **Marketing Campaigns**. - -In the upper right-hand corner, click **Add List or Segment** and select **Upload CSV**. - -You may either create a new list for your migrated recipients, choose an existing list to add these recipients to, or simply add these contacts to “All Contacts”. - -Either drag and drop your .csv file into the gray box, or click the link "or select it from your computer". - -![]({{root_url}}/images/upload_csv.gif) - -In the modal window that appears, verify your header field names and types. Make sure to select **New Text Field** for any names or strings of characters and numbers, **New Number Field** for all integer or decimal fields, and **New Date Field** for all dates. - -Once you have configured your new fields, click **Save** to complete the migration process. - -You will receive an email confirmation once SendGrid has finished processing your new contacts and they are ready for use. - -If you have development resources and would like to use our API to migrate your Legacy Newsletter lists into Marketing Campaigns, please visit our API Reference: - -* [Legacy Newsletter Lists API]({{root_url}}/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/lists.html) -* [Marketing Campaigns Contacts API]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.html) - - -{% anchor h2 %} -Replacing the Legacy Newsletter Subscription Widget -{% endanchor %} - -The [Legacy Newsletter subscription widget](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/recipients.html#-Subscription-Widget) will no longer function once Legacy Newsletter is retired on 9/30/17. - -As you migrate to Marketing Campaigns, you can leverage any of the following best-in-class email list growth integrations to manage your recipient signups: [Privy](https://privy.com/sendgrid/), [WisePops](https://support.wisepops.com/integrations/connect-wisepops-with-sendgrid), [JustUno](https://www.justuno.com/sendgrid-integrations.html), or [SendGrid’s Wordpress subscription widget](https://sendgrid.com/docs/Integrate/Tutorials/WordPress/subscription_widget.html?mc=email&mcd=Legacymigration&utm_medium=email&utm_source=nurture&cvosrc=email.nurture.Legacymigration&utm_campaign=Legacymigration). diff --git a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_unsubscribes.md b/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_unsubscribes.md deleted file mode 100644 index 429fd38d2c..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_unsubscribes.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -layout: page -weight: 80 -seo: - title: Migrating Unsubscribes - description: -title: Migrating Unsubscribes -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - - - -To honor the subscription preferences of your recipients as you migrate from Legacy Newsletter to Marketing Campaigns, you’ll need to manually migrate your Legacy Newsletter unsubscribes. Doing so will ensure that campaigns you send will not go to recipients who have previously opted out of your email. - -Marketing Campaigns allows you to manage your unsubscribes more efficiently, making it easier to comply with the standards set by [CAN-SPAM]({{root_url}}/Glossary/can_spam.html) - -* Unsubscribe groups allow your recipients to opt out of specific types of mail you send -* Once a user unsubscribes from a type of email you send (an unsubscribe group), they will not receive any email of that group, regardless of which list or segment they’re included on -* Recipient preferences will be honored whether you send mail via API or through Marketing Campaigns (point in blue box below) - -Click [here]({{root_url}}/User_Guide/Suppressions/advanced_suppression_manager.html) for more general information about unsubscribe groups. To learn more about how to create unsubscribe groups specifically for Marketing Campaigns, click [here]({{root_url}}/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html). - -Manually migrating your unsubscribes from Legacy Newsletter to Marketing Campaigns will ensure that all of the recipients you have migrated maintain their subscription preferences. - -{% info %} -It is important to note that unlike unsubscribes in Legacy Newsletter, unsubscribe groups apply to both email sent via Marketing Campaigns and any email sent over the API. This makes it much easier for you to respect your recipients' subscription preferences regardless of how you choose to send your email. -{% endinfo %} - -{% anchor h2 %} -Exporting Your Unsubscribes from Legacy Newsletter -{% endanchor %} - -To begin the migration process, navigate to your Legacy Newsletter Dashboard, click on **Recipients** and select **Manage**. - -Decide which list you want to export the unsubscribes for, hover your cursor over that list, and click **Manage Unsubscribes**. If you would like, you may add additional unsubscribes to this list before you begin your export. - -Once you have your list of unsubscribes, click **Export**. Make sure that **Unsubscribed Emails** is the only option checked and click **Export** to begin downloading a list of your unsubscribed recipients. - -{% info %} -If you have a very large list of unsubscribed recipients, this may take several minutes. -{% endinfo %} - -{% anchor h2 %} -Importing Your Unsubscribes into Marketing Campaigns -{% endanchor %} - -You now have a .csv file of recipients who unsubscribed from a particular list you maintained in Legacy Newsletter. You’ll need to decide what type of mail, or unsubscribe group, would best align with the list they opted out of in Legacy Newsletter. For instance, if your list was called “Weekly Newsletter Recipients” your new unsubscribe group might be called “Weekly Newsletter.” - -To create this new unsubscribe group, click your account name in the upper right hand corner and select **Account Overview**. - -Under **Suppressions** in the left hand nav bar, click **Unsubscribe Groups**. - -This is where you’ll enter the new unsubscribe group name and description of the type of mail a user would be opting into or out of. The name and description of your new unsubscribe group will be displayed to recipients who manage their email preferences in the future so make sure they clearly explain the types of email that pertain to this group. - -In our example, the name would be "Weekly Newsletter" and the description might be "Weekly summary of the week's top posts." - -Click **Save** to add the new group. - -Now that you have created a new unsubscribe group, it's time to import your exported Legacy Newsletter unsubscribes. - -Click the **gear icon** next to your new unsubscribe group and select **Upload CSV**. - -Drag and drop your exported .csv file into the grey box, or navigate to your file via the file browser, select it, and click **Save**. - -{% anchor h2 %} -Using Your New Unsubscribe Group -{% endanchor %} - -Now that you have successfully migrated a list of unsubscribed recipients from Legacy Newsletter into a new unsubscribe group, simply ensure that you specify this unsubscribe group when sending a campaign of this type, for instance, a weekly newsletter. - -To do this while building a campaign, simply designate this unsubscribe group under **Recipients** in the **Settings** tab of the campaign builder. - -![]({{root_url}}/images/select_unsubscribe_group.gif) - -This will prevent the campaign from being delivered to recipients in that unsubscribe group. - -For more general information on unsubscribe groups, please click [here]({{root_url}}/User_Guide/Suppressions/advanced_suppression_manager.html). - -For a more indepth tutorial on how to use unsubscribe groups and unsubscribe links in Marketing Campaigns, click [here]({{root_url}}/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html). diff --git a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/api_comparison.html b/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/api_comparison.html deleted file mode 100644 index 5a283ed6f1..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/api_comparison.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -layout: page -weight: 50 -seo: - title: API Comparison - description: -title: API Comparison -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -

For assistance please contact our support team. Login to see your contact options.

- - - - - - - - - - - - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
- Legacy API allows developers to: -
    -
  • Create, manage, and delete lists
  • -
  • Build campaigns
  • -
  • Schedule campaigns
  • -
  • Send campaigns
  • -
  • Create, edit, and delete sender identities (recipient and sender)
  • -
  • Run A/B tests
  • -
  • Assign categories to campaigns
  • -
-
- Marketing Campaigns API allows developers to: -
    -
  • Create, manage, and delete lists
  • -
  • Create, manage, and delete segments - NEW
  • -
  • Add, manage, delete contacts across lists and segments - NEW
  • -
  • Build campaigns
  • -
  • Schedule campaigns
  • -
  • Send campaigns
  • -
  • Create, edit, and delete sender identities
  • -
  • Assign categories to campaigns
  • -
-
- - - Near-complete parity with Marketing Campaigns user interface, empowering development and non-technical teams to collaborate seamlessly. -
- - - All Marketing Campaigns APIs are part of SendGrid's new v3 Web API, offering: -
    -
  • Better authentication methods
  • -
  • More consistent API standards and response data
  • -
-
diff --git a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/campaign_building.html b/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/campaign_building.html deleted file mode 100644 index 5b41673fd9..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/campaign_building.html +++ /dev/null @@ -1,238 +0,0 @@ ---- -layout: page -weight: 90 -seo: - title: Campaign Building - description: -title: Campaign Building -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -

For assistance please contact our support team. Login to see your contact options.

- -{% anchor h2 %} -Highlighted Improvements -{% endanchor %} - -
    -
  • Improved design and usability
  • -
  • Flexible workflow: no forced step-by-step process
  • -
  • More efficient tool to help you save time
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
- Step-by-Step Campaign Building Workflow -
    -
  • Forced, rigid campaign building process
  • -
-
- Flexible Campaign Building Workflow -
    -
  • Allows you to stop and start where you like; no page reloads or fear of losing work to "go back" - NEW
  • -
-
- Pre-Built Templates -
    -
  • Basic wireframes
  • -
  • Static templates
  • -
  • No new templates being added by SendGrid
  • -
-
- Pre-Built Templates -
    -
  • Growing library of responsive, customizable templates - NEW
  • -
-
- Templates -
    -
  • Templates can only be added when creating or editing campaign
  • -
  • Unlimited template storage
  • -
-
- Templates -
    -
  • Create custom templates directly from the template library - NEW
  • -
  • Store up to 300 custom templates
  • -
-
- Editing Options -
    -
  • Drag & Drop
  • -
  • WYSIWYG
  • -
  • Code
  • -
-
- Editing Options -
    -
  • Drag & Drop
  • -
  • WYSIWYG
  • -
  • Code
  • -
-
- Available Drag & Drop Modules -
    -
  • Header Image
  • -
  • Divider
  • -
  • Image + Text
  • -
  • Text + Image
  • -
  • Image
  • -
  • Image/Text
  • -
  • Text/Image
  • -
  • Text
  • -
  • - Social Media Icons -
      -
    • Facebook
    • -
    • Twitter
    • -
    • Linkedin
    • -
    • RSS
    • -
    -
  • -
-
- Available Drag & Drop Modules -
    -
  • Divider
  • -
  • Image
  • -
  • Text
  • -
  • Flexible image-text combo module
  • -
  • Spacer - NEW
  • -
  • Columns - NEW
  • -
  • Buttons - NEW
  • -
  • Code block - NEW
  • -
  • - Social Media Icons -
      -
    • Facebook
    • -
    • Twitter
    • -
    • Linkedin
    • -
    • Instagram - NEW
    • -
    • Google+ - NEW
    • -
    • Pinterest - NEW
    • -
    -
  • -
-
- Image Management -
    -
  • Images can link to URLs
  • -
  • Unlimited image storage
  • -
-
- Image Management -
    -
  • Images can link to URLs
  • -
  • Store up to 1000 images in image library
  • -
  • Share images across marketing and transactional templates - NEW
  • -
  • Ability to drag and drop images into content - NEW
  • -
  • Option to make images responsive - NEW
  • -
-
- - - Enhanced settings options/functionality -
    -
  • Email pre-header - NEW
  • -
  • Editor remembers frequently used categories - NEW
  • -
  • Assign default values to use in case there's no value for a given substitution tag - NEW
  • -
-
- Sender Settings -
    -
  • Unlimited Sender IDs
  • -
  • Select the scheduling timezone on a per-campaign basis
  • -
  • Campaigns are sent through all available IP addresses
  • -
-
- Sender Settings -
    -
  • Guidance for CAN-SPAM and CASL compliance - NEW
  • -
  • Establish up to 100 different sender IDs
  • -
  • Scheduling timezone is based on user's account timezone - NEW
  • -
  • IP Group Sending allows you to specify exactly which IPs your campaigns are sent through for improved deliverability - NEW
  • -
-
- A/B Testing -
    -
  • Test up to 10 variations
  • -
  • Send A/B test to entire audience
  • -
-
- A/B Testing -
    -
  • Test up to 6 subject line variations
  • -
  • Test up to 6 body content variations
  • -
  • Send A/B test to up to 90% of audience
  • -
  • Ability to set test duration for shorter time periods (30 minutes, 1 hour) - NEW
  • -
-
- Campaign Preview -
    -
  • Desktop view
  • -
  • Plain text view
  • -
-
- Campaign Preview -
    -
  • Desktop view
  • -
  • Mobile view - NEW
  • -
  • Plain text view
  • -
-
diff --git a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/contact_management.html b/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/contact_management.html deleted file mode 100644 index 411d38e58d..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/contact_management.html +++ /dev/null @@ -1,157 +0,0 @@ ---- -layout: page -weight: 80 -seo: - title: Contact Management - description: -title: Contact Management -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -

For assistance please contact our support team. Login to see your contact options.

- -{% anchor h2 %} -Highlighted Improvements -{% endanchor %} - -
    -
  • Each recipient email is treated as a unique contact; an update made to this unique contact will populate across any lists or segments that include the contact
  • -
  • Leverage custom fields for segmentation
  • -
  • Improved visibility into individual contact profiles
  • -
  • Improved subscription preferences and unsubscribe management
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
- Segmentation -
    -
  • Not available
  • -
-
- Segmentation - NEW -
    -
  • Create dynamic segments of your recipients based on one or many of the following: -
      -
    • Custom fields (such as geography or birthday)
    • -
    • Recipient engagement with prior campaigns
    • -
    -
  • -
-
- Subscription Management -
    -
  • List-based unsubscribe or suppression management
  • -
  • Requires senders to ensure recipients who have opted out of a list are removed from all relevant mail
  • -
-
- Subscription Management -
    -
  • Subscription preference manager (Unsubscribe Groups) allows recipients to easily opt out of (or back into) different types of email - NEW
  • -
  • Integrated unsubscribe management captures and tracks contact preferences over time at the account level
  • -
  • Improved ease of CAN-SPAM and CASL compliance for unsubscribe and spam reports - NEW
  • -
  • Custom unsubscribe management (use your own system) - NEW
  • -
-
- Adding Contacts -
    -
  • Upload CSV or TXT file
  • -
  • Manual entry (with custom fields)
  • -
  • Email API
  • -
  • CSV Import via External URL
  • -
  • All of these options can be used to add to existing lists as well as create new lists
  • -
-
- Adding Conctacts -
    -
  • Upload CSV file
  • -
  • Manual Entry (wihtout custom fields)
  • -
  • Store up to 100 lists and up to 100 segments
  • -
  • Contacts API - NEW
  • -
  • Add to "all contacts" or to new or existing static lists - NEW
  • -
  • Contacts will automatically be added to any segments whose parameters they meet; for example "women in California" - NEW
  • -
-
- Custom Tags -
    -
  • Leverage for personalization via substitution within email content
  • -
  • Limit of 465 custom tags per account
  • -
-
- Custom Fields -
    -
  • Leverage for personalized content within emails as well as dynamic segmentation - NEW
  • -
  • Text, date, and number fields enable conditional statements for segmentation such as "contains", "is before", or "is greater than" - NEW
  • -
  • Limit of 60 custom fields per account
  • -
-
- Managing Contacts -
    -
  • Contact details (e.g. name, birthday, etc.) are updated when a new CSV is uploaded
  • -
  • Individual contacts can be deleted from, copied to, or moved between different lists
  • -
  • Individual lists can be exported, updated, edited, cloned, and deleted
  • -
  • Subscription management and stats reporting for individual lists
  • -
-
- Managing Contacts -
    -
  • Contact details (e.g. name, birthday, etc.) are dynamically updated across all instances when a new CSV is uploaded, a contact is added manually, or contact data is updated via the Contacts API - NEW
  • -
  • Search all contacts for a particular email address or part of an email address (e.g. name, domain, etc.) - NEW
  • -
  • View and edit individual contact details (including custom field data, associated lists, date last updated, engagement data, etc.) - NEW
  • -
  • Filter and edit customer data in-app using contact profile pages - NEW
  • -
  • Export, edit, view, delete contact lists and segments - NEW
  • -
-
- Email Signup Tools -
    -
  • Basic javascript widget that can only be styled/modifed using HTML/CSS - BETA
  • -
-
- Email Signup Tools -
    -
  • Integrations with best-in-class signup tool providers: Privy, JustUno, and WisePops - NEW
  • -
  • WordPress Plugin Subscription Widget - NEW
  • -
      -
    • Capture first name, last name, and email address
    • -
    • Built-in opt-in confirmation
    • -
    • Add signups to specific lists within Marketing Campaigns
    • -
    • Style without HTML/CSS expertise
    • -
    -
-
diff --git a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/index.html b/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/index.html deleted file mode 100644 index ad7dcf574e..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/index.html +++ /dev/null @@ -1,97 +0,0 @@ ---- -layout: page -weight: 100 -seo: - title: Overview - description: -title: Overview -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -

For assistance please contact our support team. Login to see your contact options.

- -{% anchor h2 %} -What are the benefits of Marketing Campaigns vs. Legacy Newsletter? -{% endanchor %} - -
    -
  • Simple yet powerful segmentation: Easily send targeted campaigns based on customer data and email engagement.
  • -
  • Reporting that's clear and actionable: Which links were clicked and who engaged with your campaigns.
  • -
  • Flexible, efficient workflows: Save time with improved design and usability that allows you to work in your preferred flow.
  • -
  • Continuous improvements: Benefit from ongoing investment in feature enhancements driven by your needs!
  • -
- -{% anchor h2 %} -Side-by-Side Feature Comparisons -{% endanchor %} - -{% anchor h3 %} -Campaign Building -{% endanchor %} - - - -{% anchor h3 %} -Contact Management -{% endanchor %} - -
    -
  • Each recipient email is treated as a unique contact; an update made to this unique contact will populate across any lists or segments that include the contact.
  • -
  • Leverage custom fields for segmentation.
  • -
  • Improved visibility into individual contact profiles.
  • -
  • Improved subscription preferences and unsubscribe management.
  • -
  • Click to view a detailed side-by-side comparison of contact management!
  • -
- -{% anchor h3 %} -Statistics and Reporting -{% endanchor %} - - - -{% anchor h3 %} -Pricing -{% endanchor %} - - - -{% anchor h3 %} -API -{% endanchor %} - - - -{% anchor h3 %} -Security and Compliance -{% endanchor %} - - diff --git a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/pricing.html b/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/pricing.html deleted file mode 100644 index f5e4f6a27b..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/pricing.html +++ /dev/null @@ -1,60 +0,0 @@ ---- -layout: page -weight: 60 -seo: - title: Pricing - description: -title: Pricing -navigation: - show: true ---- - - - - - - - - - - - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
- Charged a premium for each email sent through Legacy Newsletter. - - If you used Legacy Newsletter between 1 August 2016 and 30 March 2017, when you switch to Marketing Campaigns, you can choose how you’d like to pay. You can continue to pay per email sent or you can choose to pay per contact you store in Marketing Campaigns. -
-

Base Package

-

$0.25 / 1,000 emails sent

-
-

Base Package plus

-

Per email you send

-

$0.25 / 1,000 emails sent

-
-

OR

-
-

Per contact you store

-

$10 / 10,000 contacts stored

-
- - - Marketing Campaigns pricing encourages identifying and prioritizing your most engaged recipients in order to achieve greater: -
    -
  • Deliverability
  • -
  • Retention
  • -
  • Engagement
  • -
  • Revenue
  • -
-
- -{% info %} -We offer eligible Legacy Newsletter customers who migrate to Marketing Campaigns the option to pay $0.25/1,000 emails sent. -{% endinfo %} diff --git a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/security_compliance.html b/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/security_compliance.html deleted file mode 100644 index 6f2df0ba5d..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/security_compliance.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -layout: page -weight: 40 -seo: - title: Security and Compliance - description: -title: Security and Compliance -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -

For assistance please contact our support team. Login to see your contact options.

- - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
-
    -
  • External CSV URL eliminates need to host personally identifiable information (PII) with SendGrid
  • -
-
-
    -
  • Improved unsubscribe and suppression management - NEW
  • -
  • Improved anti-spoofing protection with sender ID verification - NEW
  • -
  • Improved whitelabel management with domain-unique DKIM keys and dynamic SPF - NEW
  • -
  • SendGrid-hosted SPF keeps sender root domain free of additional lookups - NEW
  • -
-
diff --git a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/statistics_reporting.html b/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/statistics_reporting.html deleted file mode 100644 index 2c85709ab3..0000000000 --- a/source/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/statistics_reporting.html +++ /dev/null @@ -1,731 +0,0 @@ ---- -layout: page -weight: 70 -seo: - title: Statistics and Reporting - description: -title: Statistics and Reporting -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -

For assistance please contact our support team. Login to see your contact options.

- -{% anchor h2 %} -Highlighted Improvements -{% endanchor %} - -
    -
  • Cleaner, more actionable statistics
  • -
  • View which individual links were clicked most
  • -
  • Ability to see which recipients engaged with your campaigns
  • -
- -{% anchor h3 %} -Table of Contents -{% endanchor %} - - - -{% anchor h2 %} -Dashboard / Overview -{% endanchor %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
- Dashboard -
    -
  • Aggregate data of sends via Legacy Newsletter during defined period
  • -
  • See up to 7 days of data
  • -
-
- Overview -
    -
  • Aggregate data of sends via Marketing Campaigns during defined period
  • -
  • See up to 30 days of data - NEW
  • -
  • Toggle various stats on and off (e.g. focus on "Delivered" and hide "Requests") - NEW
  • -
-
- Requests -
    -
  • Number of attempted sends
  • -
-
- Requests -
    -
  • Number of attempted sends
  • -
-
- Delivered -
    -
  • Number of emails / requests
  • -
-
- Delivered -
    -
  • - Delivered emails / requests -

    - Note: Requests in Marketing Campaigns include reuqests to send to invalid emails. Over time, this can start to lower your delivered email rate. - - It's important to remove invalid emails from your contact lists in order to avoid this--and avoid paying for invalid emails! -

    -
  • -
-
- Opens -
    -
  • Opens / Delivered
  • -
-
- Opens -
    -
  • Opens / Delivered
  • -
-
- Unique Opens -
    -
  • Unique Opens / Delivered
  • -
-
- Unique Opens -
    -
  • Unique Opens / Delivered
  • -
-
- Clicks -
    -
  • Clicks / Delivered
  • -
-
- Clicks -
    -
  • Number of clicks
  • -
-
- Unique Clicks (UC) -
    -
  • Unique Clicks / Delivered
  • -
-
- Unique Clicks (UC) -
    -
  • Unique Clicks / Delivered
  • -
-
- Click-Through Rate (CTR) -
    -
  • Unique Clicks / Unique Opens
  • -
-
- Click-Through Rate (CTR) -
    -
  • Not displayed on overview page
  • -
-
- Total Click-Through (TCTR) -
    -
  • Total Clicks / Total Opens
  • -
-
- Total Click-Through (TCTR) -
    -
  • Not displayed on overview page
  • -
-
- Bounces -
    -
  • Unique Bounces / Requests
  • -
-
- Bounces -
    -
  • Number of unique bounces
  • -
-
- Spam Reports -
    -
  • Spam Reports / Delivered
  • -
-
- Spam Reports -
    -
  • Number of unique spam reports
  • -
-
- Repeat Spam Reports -
    -
  • (Emails marked as spam more than once by the same recipient) / Delivered Emails
  • -
-
- Repeat Spam Reports -
    -
  • Number of spam reports (including emails marked as spam more than once by the same recipient)
  • -
-
- Unsubscribes -
    -
  • Unsubscribes / Delivered
  • -
-
- Unsubscribes -
    -
  • Number of unsubscribes
  • -
-
- Repeat Bounces: Same as bounce -
    -
  • Repeat Bounces / Requests
  • -
  • Suppressed emails that are known to be undeliverable; we drop them on your behalf to protect deliverability
  • -
-
- Bounce Drops -
    -
  • Suppressed emails that are known to be undeliverable; we drop them on your behalf to protect deliverability
  • -
-
- Invalid Emails -
    -
  • (non-existant emails) / Requests
  • -
  • Invalid format or no MX record
  • -
-
- Invalid Emails -
    -
  • Number of non-existent emails (invalid format or no MX record)
  • -
-
- -{% anchor h2 %} -Campaigns Summary View -{% endanchor %} - - - - - - - - - - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
- Marketing Email > Manage -
    -
  • Downloadable CSV of campaigns
  • -
  • Campaign Search
  • -
-
- Campaigns Summary -
    -
  • At-a-glance view of campaign performance
  • -
  • Toggle between # and % views - NEW
  • -
  • Downloadable CSV of campaigns
  • -
  • Campaign search
  • -
  • Search for campaigns, sort by "status" (Draft, Sent, etc.) - NEW
  • -
  • Actions
  • -
      -
    • Duplicate
    • -
    • Create template - NEW
    • -
    • View stats
    • -
    • Preview
    • -
    • Delete
    • -
    -
-
- Per-Campaign Actions -
    -
  • Edit (if in draft status)
  • -
  • View
  • -
  • Clone
  • -
  • View Stats
  • -
  • Delete
  • -
-
- Per-Campaign Actions -
    -
  • Edit (if in draft status)
  • -
  • Duplicate
  • -
  • Create template - NEW
  • -
  • View Stats
  • -
  • Preview
  • -
  • Delete
  • -
-
- Stats for this view -
    -
  • Status
  • -
  • Sent date and time
  • -
  • Sent
  • -
      -
    • Number of usable, de-duplicated recipients from assigned lists
    • -
    -
  • Opens
  • -
  • Open Rate
  • -
  • Unique Opens
  • -
  • Unique Open Rate
  • -
  • Total Clicks
  • -
  • Click-Through Rate (CTR)
  • -
      -
    • Unique Clicks / Unique Opens
    • -
    -
  • Total Click-Through Rate (TCTR)
  • -
      -
    • Clicks / Opens
    • -
    -
  • Opt-out/Unsubscription Rate
  • -
  • Spam Reports
  • -
-
- Stats for this view -
    -
  • Status
  • -
  • Sent date and time
  • -
  • A/B Test
  • -
  • Delivered - NEW
  • -
      -
    • Delivered / Requests
    • -
    -
  • Unique Opens
  • -
      -
    • Unique Opens / Delivered
    • -
    -
  • Unique Clicks
  • -
      -
    • Unique Clicks / Delivered
    • -
    -
  • Unsubscribes
  • -
      -
    • Unsubscribes / Delivered
    • -
    -
-
- -{% anchor h2 %} -Individual Campaign View -{% endanchor %} - - - - - - - - - - - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
- Individual Campaign Stats -
    -
  • Same stats as on Dashboard
  • -
      -
    • Bounces / Repeat Bounces
    • -
    • Clicks / Unique Clicks / Click-Through Rate
    • -
    • Deliveries
    • -
    • Invalid Emails
    • -
    • Opens / Unique Opens
    • -
    • Requests
    • -
    • Spam Reports / Repeat Spam Reports
    • -
    • Unsubscribes
    • -
    -
-
- Individual Campaign Stats -
    -
  • Includes stats on Overview
  • -
  • Shows which recipients opened and/or clicked within the campaign - NEW
  • -
  • Offers view of performance over time
  • -
  • A/B testing summary
  • -
  • Link click tracking summary - NEW
  • -
  • Campaign details
  • -
      -
    • Preview, Sender ID, Subject Line, Lists, Segments
    • -
    -
-
- Donwload Stats -
    -
  • .xls with all stats aggregated
  • -
-
- Download -
    -
  • .xls with all stats
  • -
      -
    • By day
    • -
    • By A/B test results
    • -
    • Cumulative
    • -
    -
-
- Campaign Storage -
    -
  • Store Unlimited Campaigns
  • -
-
- Campaign Storage -
    -
  • Store up to 2,500 campaigns
  • -
-
- -{% anchor h2 %} -CSV Download Comparison -{% endanchor %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Legacy NewsletterMarketing Campaigns
- - - Date of data pull -
- - - Campaign ID -
- Name - - Campaign Name -
- Attempted - - Requests -
- Delivered - - Delivered -
- Opens - - Opens -
- - - Daily Open Rate -
- - - Cumulative Open Rate -
- Unique Opens - - Unique Opens -
- - - Daily Unique Opens -
- - - Cumulative Unique Opens -
- Clicks - - Clicks -
- - - Daily Click Rate -
- - - Cumulative Click Rate -
- Unique Clicks - - Unique Clicks -
- - - Daily Unique Clicks -
- - - Cumulative Unique Click Rate -
- CTR - - CTR -
- TCTR - - TCTR -
- Bounces - - Bounces -
- - - Daily Bounce Rate -
- - - Cumulative Bounce Rate -
- Repeate Bounces - - Bounce Drops -
- Spam Report - - Spam Report -
- - - Daily Spam Report -
- - - Cumulative Spam Report -
- Repeat Spam - - Spam Report Drop -
- Unsubscribes - - Unsubscribes -
- - - Daily Unsubscribe Rate -
- - - Cumulative Unsubscribe Rates -
- Invalid Emails - - Invalid Emails -
diff --git a/source/User_Guide/Legacy_Newsletter/faq.md b/source/User_Guide/Legacy_Newsletter/faq.md deleted file mode 100644 index dc49a7f0cd..0000000000 --- a/source/User_Guide/Legacy_Newsletter/faq.md +++ /dev/null @@ -1,395 +0,0 @@ ---- -layout: page -weight: 0 -seo: - title: Frequently Asked Questions - description: Answers to common questions about migrating to Marketing Campaigns -title: Frequently Asked Questions -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - -## Legacy Newsletter Sunset (#-Legacy-Newsletter-Sunset) - -* [Why did you retire Legacy Newsletter?](#-Why-did-you-retire-Legacy-Newsletter) -* [How long will Legacy Newsletter be available?](#-How-long-will-Legacy-Newsletter-be-available) -* [What will happen to my account when the product is retired?](#-What-will-happen-to-my-account-when-the-product-is-retired) -* [What if I choose not to migrate?](#-What-if-I-choose-not-to-migrate) -* [Will engagement stats continue to populate after the sunset?](#-Will-engagement-stats-continue-to-populate-after-the-sunset) -* [Will data on unsubscribes, bounces, etc., continue to populate after the retirement?] (#-Will-data-on-unsubscribes-bounces- etc-continue-to-populate-after-the-retirement? - -## [Pricing](#-Pricing) - -* [Is the pricing for Marketing Campaigns the same as it is for Legacy Newsletter](#-Is-the-pricing-for-Marketing-Campaigns-the-same-as-it-is-for-Legacy-Newsletter) -* [Where do I choose how to pay for Marketing Campaigns?](#-Where-do-I-choose-how-to-pay-for-Marketing-Campaigns) -* [How can I estimate what it will cost to use Marketing Campaigns?](#-How-can-I-estimate-what-it-will-cost-to-use-Marketing-Campaigns) -* [Why does Marketing Campaigns charge me for storing contacts?](#-Why-does-Marketing-Campigns-charge-me-for-storing-contacts) -* [What is the additional value of Marketing Campaigns vs. Legacy Newsletter?](#-What-is-the-additional-value-of-Marketing-Campaigns-vs-Legacy-Newsletter) -* [I’m using Marketing Campaigns, why am I still being billed for Legacy Newsletter?](#-Im-using-Marketing-Campaigns-why-am-I-still-being-billed-for-Legacy-Newsletter) - -## [Migrating](#-Migrating) - -* [Will SendGrid automatically migrate my account to Marketing Campaigns?](#-Will-SendGrid-automatically-migrate-my-account-to-Marketing-Campaigns) -* [What files or data can I download from Legacy Newsletter?](#-What-files-or-data-can-I-download-from-Legacy-Newsletter) -* [What do I need to prepare before to migrating to Marketing Campaigns?](#-What-do-I-need-to-prepare-before-migrating-to-Marketing-Campaigns) -* [How do I move my contacts from Legacy Newsletter to Marketing Campaigns?](#-How-do-I-move-my-contacts-from-Legacy-Newsletter-to-Marketing-Campaigns) -* [How do I move my templates from Legacy Newsletter to Marketing Campaigns?](#-How-do-I-move-my-templates-from-Legacy-Newsletter-to-Marketing-Campaigns) -* [How do I transfer my unsubscribes from Legacy Newsletter to Marketing Campaigns?](#-How-do-I-transfer-my-unsubscribes-from-Legacy-Newsletter-to-Marketing-Campaigns) -* [How do I download and save my historical stats?](#-How-do-I-download-and-save-my-historical-stats) -* [How do I migrate my API integration with Legacy Newsletter to Marketing Campaigns?](#-How-do-I-migrate-my-API-integration-with-Legacy-Newsletter-to-Marketing-Campaigns) - -## [Contact Management](#-Contact-Management) - -* [What information will Marketing Campaigns store about my contacts?](#-What-information-will-Marketing-Campaigns-store-about-my-contacts) -* [Will the Subscription Widget also be retired?](#-Will-the-Subscription-Widget-also-be-retired?) - -## [Segmentation](#-Segmentation) - -* [What is segmentation?](#-What-is-segmentation) -* [How is a list different from a segment?](#-How-is-a-list-different-from-a-segment) -* [How do I create a segment?](#-How-do-I-create-a-segment) - -## [Statistics](#-Statistics) - -* [What will happen to all of my historical stats in Legacy Newsletter?](#-What-will-happen-to-all-of-my-historical-stats-in-Legacy-Newsletter) -* [Why are some stats that I'm used to in Legacy Newsletter missing in Marketing Campaigns?](#-Why-are-some-stats-that-Im-used-to-in-Legacy-Newsletter-missing-in-Marketing-Campaigns) - -## [Campaign Creation](#-Campaign-Creation) - -* [How is creating a campaign different in Marketing Campaigns than Legacy Newsletter?](#-How-is-creating-a-campaign-different-in-Marketing-Campaigns-than-Legacy-Newsletter) - -*********** - -{% anchor h2 %} -Legacy Newsletter Sunset -{% endanchor %} - -{% anchor h3 %} -Why did you retire Legacy Newsletter? -{% endanchor %} - -We created Legacy Newsletter to deliver on customer demand for a simple, straightforward e-newsletter tool to support user engagement and retention. - -Over time, the needs and expectations of our customers—and the market at large—have continued to grow. In response, we built Marketing Campaigns: an easy-to-use solution designed to help customers confidently achieve their email marketing goals. - -In order to best meet your email marketing needs, our focus will be dedicated to optimizing Marketing Campaigns moving forward. Without continued investment, Legacy Newsletter would have become obsolete and impractical for us to continue to support to the degree our customers deserve. - -{% anchor h3 %} -How long will Legacy Newsletter be available? -{% endanchor %} - -As of **September 30, 2017**, Legacy Newsletter has been deprecated. You can no longer create or send campaigns, though you can download data for a **brief** grace period. SendGrid recommends you [migrate to Marketing Campaigns]({{root_url}}/User_Guide/Legacy_Newsletter/migration_checklist.html). - -Whether or not you choose not to migrate, you need to download any data from Legacy Newsletter you wish to maintain **ASAP**. - -{% anchor h3 %} -What will happen to my account when the product is retired? -{% endanchor %} - -Now that Legacy Newsletter has been sunset, you cannot create or send campaigns. This deprecation includes both the web interface at sendgrid.com/newsletter and [APIs]({{root_url}}/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/index.html) at `api.sendgrid.com/api/newsletter`. - -Statistics related to email sent through Legacy Newsletter before deprecation will be included in your overall SendGrid stats, and are identifiable by the default category of *Newsletter*, along with any additional categories you’ve assigned your Legacy Newsletter campaigns. - -{% warning %} -There is currently a **brief** grace period to access and download any data you have stored in the application such as contact lists, templates, statistics, or prior campaigns. -{% endwarning %} - -{% anchor h3 %} -What if I choose not to migrate? -{% endanchor %} - -If you choose not to migrate, you’ll need to download any data and assets from Legacy Newsletter you wish to retain **ASAP**. SendGrid is offering a **short** grace period for those that have not migrated yet, but be aware that anything not downloaded asap will soon be permanently deleted. - -{% anchor h3 %} -Will engagement stats continue to populate after the retirement? -{% endanchor %} - -If a recipient engages with an email after the sunset date, those engagement stats will be updated in the application for a brief grace period. - -{% anchor h3 %} -Will data on unsubscribes, bounces, etc., continue to populate after the retirement? -{% endanchor %} - -If a recipient unsubscribes from your email, marks it as spam, or their address bounces, that information will be updated in the application for a brief grace period. - - -{% anchor h2 %} -Pricing -{% endanchor %} - -{% anchor h3 %} -Is the pricing for Marketing Campaigns the same as it is for Legacy Newsletter? -{% endanchor %} - -Both Legacy Newsletter and Marketing Campaigns start with your base SendGrid plan (which can be shared with any mail you send using the API or SMTP relay). For instance, if you have the Pro 300K plan and send 100,000 emails through Legacy or Marketing Campaigns, you’ll have 200,000 emails remaining to send through the API or SMTP relay. - -From there, each email marketing solution charges a premium for sending through the user interface. With Legacy Newsletter it’s a **$0.25 fee per 1,000 emails you send**. For Marketing Campaigns, it’s a **$10 fee per 10,000 contacts you store**. Your first 2,000 contacts in Marketing Campaigns are free. - -If you used Legacy Newsletter between 1 August 2016 and 30 March 2017, when you switch to Marketing Campaigns, you can [choose how you’d like to pay]( https://app.sendgrid.com/settings/choose_how_you_pay). You can continue to pay per email sent or you can choose to pay per contact you store in Marketing Campaigns: - - - - - - -

Pay per email you send

-

Special offer for Legacy Newsletter
migrators

-
-

$0.25/1,000 emails

-

(plus base plan)

-

Pay per contact you store

-

Standard Marketing Campaigns pricing

-
-

$10/10,000 contacts

-

(plus base plan)

-
- -{% anchor h3 %} -Where do I choose how to pay for Marketing Campaigns? -{% endanchor %} - -Visit the [Choose How You Pay page](https://app.sendgrid.com/settings/choose_how_you_pay) in your account. If that link does not work for you, Navigate to **Settings** then **Plan and Billing Details**, then scroll to Marketing Campaigns and click **Learn More**. - -{% info %} -To be eligible for this pricing offer you need to have sent email via Legacy Newsletter between August 1, 2016 and March 30, 2017. -{% endinfo %} - -{% anchor h3 %} -How can I estimate what it will cost to use Marketing Campaigns? -{% endanchor %} - -Leverage our [Pricing Calculator](https://app.sendgrid.com/settings/choose_how_you_pay) to enter the volume of email you’ll be sending as well as the number of contacts you’ll store in Marketing Campaigns. - -{% anchor h3 %} -Why does Marketing Campigns charge me for storing contacts? -{% endanchor %} - -The default pricing for Marketing Campaigns is to charge for contacts stored in Marketing Campaigns as opposed to an additional fee for each email sent through Legacy Newsletter. This is aligned with sending best practices by encouraging you to monitor how engaged your recipients are and modify your marketing strategy accordingly. Here’s how: - -**Send less frequently to unengaged recipients:** If you have recipients who are not opening your email, remove them from your list! Continually sending to these recipients not only leads to a poor recipient experience, but is also a poor use of your time and money. By removing unengaged recipients, you save money, improve deliverability, and maintain a positive reputation with your recipients and your recipients’ inbox providers. - -**Send more frequently to engaged recipients:** If you have recipients who are highly engaged, test sending to them more often. With the Marketing Campaigns pricing model, you’re only paying for storing that individual contact, regardless of how often you send to them. - -{% info %} -Emails sent through either Legacy Newsletter or Marketing Campaigns count towards your base plan. -{% endinfo %} - -The ability to segment your contacts into meaningful recipient groups is a core benefit of Marketing Campaigns (and a key enhancement over Legacy Newsletter). Segmentation requires Marketing Campaigns to store your contacts, and that data storage is the expense that drives our pricing. - -{% anchor h3 %} -What is the additional value of Marketing Campaigns vs. Legacy Newsletter? -{% endanchor %} - -**[Segmentation:]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html)** Send more targeted, relevant email to your recipients by leveraging data about your customers as well as how they’ve [engaged with your emails]({{root_url}}/User_Guide/Marketing_Campaigns/campaigns.html#-Create-a-Segment-Based-On-Your-Engagement-Metrics). - -**[Contact management:]({{root_url}}/User_Guide/Marketing_Campaigns/contacts.html)** Gain visibility into contact details such as custom data (name, city, etc.), associated lists, last campaign engagement dates, and more with individual contact profiles that are dynamically updated. - -**[Visibility into user engagement:]({{root_url}}/User_Guide/Marketing_Campaigns/campaigns.html#-Engagement-Statistics)** Marketing campaigns will show you which customers opened and/or clicked your email campaigns. You can also see which individual links in your campaigns were clicked most frequently. - -**Improved user experience:** Ease of use is central to Marketing Campaigns. You’ll love the improved design and our UI/UX team has thoughtfully considered every workflow and is continuously working with customers to find opportunities to optimize. - -**[Flexible campaign building flow:]({{root_url}}/User_Guide/Marketing_Campaigns/getting_started.html)** Marketing Campaigns accommodates your preferred workflow; there’s no forced step-by-step process. The end result is increased efficiency and a more pleasant experience. - -**[Recipient preferences:]({{root_url}}/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html)** Allow your users to easily opt out of different types of content you send using Unsubscribe Groups, and rely on Marketing Campaigns to track that data so you can reliably honor recipient preferences. - -**Better integration:** Marketing Campaigns is fully integrated into SendGrid, allowing you to easily navigate to important tools such as Stats where you can see more complete data such as geography or device type. - -**Ongoing enhancements:** SendGrid is investing heavily in Marketing Campaigns. Not only will existing functionality be optimized, we’ll continue to add new, valuable capabilities to the solution. - -**[Improved security and compliance]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/security_compliance.html):** Marketing Campaigns includes several security and compliance improvements. For example, you'll find the [unsubscribe and suppression management tools]({{root_url}}/Classroom/Basics/Marketing_Campaigns/unsubscribe_groups.html) have been improved to make it easier for your recipients to unsubscribe from unwanted email, and [Marketing Campaign's sender identities]({{root_url}}/User_Guide/Marketing_Campaigns/senders.html) have greatly improved our anti-spoofing protection. - -{% anchor h3 %} -I’m using Marketing Campaigns, why am I still being billed for Legacy Newsletter? -{% endanchor %} - -Your final Legacy Newsletter bill will be generated on the first calendar day of the month following the last month you send via Legacy Newsletter. If you use both Legacy Newsletter and Marketing Campaigns, you’ll see two distinct line items on your invoices. - -For example, if you sent your final Legacy Newsletter campaign on June 15, and began using Marketing Campaigns at any point within June, you’ll see both items on your July invoice. - -{% anchor h2 %} -Migrating -{% endanchor %} - -{% anchor h3 %} -Will SendGrid automatically migrate my account to Marketing Campaigns? -{% endanchor %} - -No. We do not have any automated tools for migrating your Legacy Newsletter account to Marketing Campaigns. However, we’ve built a robust [toolkit]({{root_url}}/User_Guide/Legacy_Newsletter/index.html) of resources to help make the manual steps to migrate your account fast and simple. And as always, if you run into any issues with the process, SendGrid’s world class support team is here to help! - -You can also use the API to migrate your content, recipients, unsubscribes, and statistics from the Legacy Newsletter to Marketing Campaigns. For more information, see our [Legacy Newsletter to Marketing Campaigns API Migration Guide](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.html). - -{%anchor h3 %} -What files or data can I download from Legacy Newsletter? -{% endanchor %} - -For a limited time following the sunset of Legacy Newsletter, you will be able to download: - - * [Recipient Lists](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_recipient_lists.html) - * [Templates](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_content.html) - * [Statistics](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/Migration_Tutorials/downloading_historical_statistics.html) - * [Unsubscribes](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_unsubscribes.html) - * [Images](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_images.html) - * Sender Addresses - * Email Reports - - *To save Sender Addresses:* - - 1. From the application, navigate to **Sender Addresses**. - 2. Select **Manage**. - 3. Copy and paste the information you wish to save into a new file. - - *To download Email Reports:* - - 1. Navigate to **Marketing Email** and then select **Manage**. - 2. Find the campaign you wish to save the data for and click the title. - -{% anchor h3 %} -What do I need to prepare before migrating to Marketing Campaigns? -{% endanchor %} - -First, review this [Migration Checklist]({{root_url}}/User_Guide/Legacy_Newsletter/migration_checklist.html). - -While your migration plan will depend on your unique scenario, the migration checklist will encourage you to consider the following: - -1. Do you wish to migrate existing contact lists? -2. Do you have invalid or unsubscribed emails you need to consider? -3. Are there key templates you wish to use in Marketing Campaigns, or are you starting fresh? -4. Are there images you have stored in Legacy Newsletter that you wish to use with Marketing Campaigns? -5. Are there campaign statistics you want to download for future reference or analysis? -6. Do you want to spend time testing campaign sends in Marketing Campaigns before you fully migrate? -7. Do you have API integrations you need to migrate? - -{% anchor h3 %} -How do I move my contacts from Legacy Newsletter to Marketing Campaigns? -{% endanchor %} - -View our contact migration [how-to video or documentation page]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_recipient_lists.html) for step-by-step instructions. - -{% anchor h3 %} -How do I move my templates from Legacy Newsletter to Marketing Campaigns? -{% endanchor %} - -View our template migration [how-to video or documentation page]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_content.html) for step-by-step instructions. - -{% anchor h3 %} -How do I transfer my unsubscribes from Legacy Newsletter to Marketing Campaigns? -{% endanchor %} - -View our [unsubscribe migration how-to video or documentation page]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_unsubscribes.html) for step-by-step instructions. - -{% anchor h3 %} -How do I download and save my historical stats? -{% endanchor %} - -View our [how-to video and documentation page]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/downloading_historical_statistics.html) for step-by-step instructions to download your historical stats/data. - -{% anchor h3 %} -How do I migrate my API integration with Legacy Newsletter to Marketing Campaigns? -{% endanchor %} - -Please refer to our [API comparison]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/api_comparison.html) to see how the Legacy Newsletter API maps to the Marketing Campaigns API. For help with migrating your content, recipients, unsubscribes, and statistics from the Legacy Newsletter to Marketing Campaigns using the API, please refer to our [Legacy Newsletter to Marketing Campaigns API Migration Guide]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.html). - -{% anchor h2 %} -Contact Management -{% endanchor %} - -{% anchor h3 %} -What information will Marketing Campaigns store about my contacts? -{% endanchor %} - -Marketing Campaigns will store two types of data about your contacts: - -**Custom Fields:** Any information you share with us about your contacts such as age, geography, last purchase, etc. This data can be added using a CSV upload or using our [Contacts API]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.html). Currently, Marketing Campaigns can store up to 60 different [custom fields]({{root_url}}/User_Guide/Marketing_Campaigns/custom_fields.html). - -**Email Engagement:** Data about [how your customers engage]({{root_url}}/User_Guide/Marketing_Campaigns/campaigns.html#-Engagement-Statistics) with emails you send using Marketing Campaigns. This includes whether they’ve opened or clicked specific campaigns as well as when they last opened or clicked any campaign you’ve sent. - -{% anchor h3 %} -Will the Subscription Widget also be retired? -{% endanchor %} - -The [Legacy Newsletter subscription widget](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/Legacy_Newsletter_Features/recipients.html#-Subscription-Widget) will no longer function once Legacy Newsletter is retired on 9/30/17. - -As you migrate to Marketing Campaigns, you can leverage any of the following best-in-class email list growth integrations to manage your recipient signups: [Privy](https://privy.com/sendgrid/), [WisePops](https://support.wisepops.com/integrations/connect-wisepops-with-sendgrid), [JustUno](https://www.justuno.com/sendgrid-integrations.html), or [SendGrid’s Wordpress subscription widget](https://sendgrid.com/docs/Integrate/Tutorials/WordPress/subscription_widget.html?mc=email&mcd=Legacymigration&utm_medium=email&utm_source=nurture&cvosrc=email.nurture.Legacymigration&utm_campaign=Legacymigration). - -{% anchor h2 %} -Segmentation -{% endanchor %} - -{% anchor h3 %} -What is segmentation? -{% endanchor %} - -Segmentation is Marketing Campaigns’ powerful tool to help you send more relevant, personalized email marketing campaigns. With segmentation you can target specific portions of your audience who share common characteristics and craft content that’s highly relevant to them. - -You can segment based on customer data (like city or gender) as well as engagement with your email (such as opening within a certain timeframe, or clicking a link within a specific campaign). - -As an example, you could send a different email to “Chicago customers who opened campaign X” than “San Francisco customers who opened Campaign X.” Doing so helps you add more value to your recipients’ inboxes, helping you achieve your engagement and revenue goals along the way. - -Learn more about Segmentation with Marketing Campaigns within our [Documentation]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html#-Create-a-Segment). - -{% anchor h3 %} -How is a list different from a segment? -{% endanchor %} - -Lists are simply static collections of Marketing Campaigns contacts. You can upload contacts either [via CSV]({{root_url}}/User_Guide/Marketing_Campaigns/contacts.html), manually, or via [API integration]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.html) and Marketing Campaigns will store them as-is. You can also always choose to manually add or remove recipients from a particular list. - -Segments are dynamic collections of Marketing Campaigns contacts grouped together, or segmented, based on criteria you define. This can include data you track about them, such as gender, location, or package type, or how they’ve engaged with your emails previously. You can create a segment that pulls from all of your Marketing Campaigns contacts or from a specific existing list you’ve created. - -Learn more about Lists and Segments within our [documentation]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html). - -{% anchor h3 %} -How do I create a segment? -{% endanchor %} - -To create a segment, you’ll first need to upload your recipients (and associated recipient data) as contacts within Marketing Campaigns. You can upload contacts to your account either [via CSV]({{root_url}}/User_Guide/Marketing_Campaigns/contacts.html), manually, or via [API integration]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.html). - -Once your contacts are stored in Marketing Campaigns, you’ll leverage the user interface to define the conditions of your segment. These can be either data about your recipients that you’ve included in your upload (such as name, gender, package type, etc.) or how they’ve engaged with your emails previously (such as last clicked date, opening a particular campaign, or both!). - -For step-by-step instructions on creating a segment, see our [documentation]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html#-Create-a-Segment). - -{% anchor h2 %} -Statistics -{% endanchor %} - -{% anchor h3 %} -What will happen to all of my historical stats in Legacy Newsletter? -{% endanchor %} - -After **September 30, 2017** you will be given a short grace period to download your data. After this grace period this data will be permanently deleted. - -For this reason, we recommend you export any data you wish to retain for the long term **asap**. [View our migration guide for details on how to export this data.](https://sendgrid.com/docs/User_Guide/Legacy_Newsletter/Migration_Tutorials/downloading_historical_statistics.html) - -{% anchor h3 %} -Why are some stats that I'm used to in Legacy Newsletter missing in Marketing Campaigns? -{% endanchor %} - -Marketing Campaigns takes a slightly different approach to presenting statistics than Legacy Newsletter. To help you navigate these changes, we’ve created a [side-by-side comparison]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/statistics_reporting.html) for you to review. If there are specific statistics you would like available in Marketing Campaigns, please let us know by emailing us at LegacyMigration@SendGrid.com. - -In many instances you’ll find that Marketing Campaigns provides more in-depth statistics than Legacy Newsletter. For instance, you can view which links within a campaign were clicked most often, or which individuals opened or clicked within particular campaigns. Insights like these help you learn about and optimize recipient engagement. - -Learn more about Engagement Statistics with Marketing Campaigns [here]({{root_url}}/Classroom/Basics/Marketing_Campaigns/engagement_stats.html). - -{% anchor h2 %} -Campaign Creation -{% endanchor %} - -{% anchor h3 %} -How is creating a campaign different in Marketing Campaigns than Legacy Newsletter? -{% endanchor %} - -Both Legacy Newsletter and Marketing Campaigns help you manage contacts, build campaigns, run multivariate tests, schedule sends, and review analytics. However, these tasks either more robust or easier to execute (or both!) in Marketing Campaigns. For example, Marketing Campaigns offers: - -* Clean visuals and a more intuitive user interface -* More options for managing contact profiles -* Ability to create dynamic segments to send targeted campaigns -* A flexible campaign builder that lets you work according to your preferred workflow -* Improved unsubscribe management -* Increased granularity into campaign performance, for instance, individual link click tracking - -And there’s much more! Explore our side-by-side [comparison of Legacy Newsletter and Marketing Campaigns]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/index.html). diff --git a/source/User_Guide/Legacy_Newsletter/index.html b/source/User_Guide/Legacy_Newsletter/index.html index cbd36bac89..6eba63406e 100644 --- a/source/User_Guide/Legacy_Newsletter/index.html +++ b/source/User_Guide/Legacy_Newsletter/index.html @@ -14,99 +14,23 @@ {% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act now to download your data or migrate any assets to Marketing Campaigns. +Legacy Newsletter has been retired. {% endwarning %} -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. +Your email marketing needs can now be met by Marketing Campaigns, which offers a best in class editing experience, +contact segmentation for powerful targeting, and actionable analytics to help you measure and improve your results. - - -
- -
- -

Pricing

-
-
-

- Both Legacy Newsletter and Marketing Campaigns start with your base SendGrid plan (which can be shared with any mail you send using the API or SMTP relay). -

- -

- From there, each email marketing solution charges a premium for sending through the user interface. With Legacy Newsletter, it's a $0.25 fee per 1,000 emails you send. -

-
-
- -

If you used Legacy Newsletter between 1 August 2016 and 30 March 2017, when you switch to Marketing Campaigns, you can choose how you’d like to pay. You can continue to pay per email sent or you can choose to pay per contact you store in Marketing Campaigns:

- - - - - - -

Pay per email you send

-

Special offer for Legacy Newsletter migrators

-
-

$0.25/1,000 emails

-

(plus base plan)

-

Pay per contact you store

-

Standard Marketing Campaigns pricing

-
-

$10/10,000 contacts

-

(plus base plan)

-
-
-Pricing Calculator -Migration Feedback + diff --git a/source/User_Guide/Legacy_Newsletter/letter_from_our_CPO.md b/source/User_Guide/Legacy_Newsletter/letter_from_our_CPO.md deleted file mode 100644 index f27a4f3e9d..0000000000 --- a/source/User_Guide/Legacy_Newsletter/letter_from_our_CPO.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -layout: page -weight: 100 -title: A Letter from Steve Sloan, SendGrid's CPO -navigation: - show: false ---- -March 30, 2016 - -{% anchor h2 %} -Legacy Newsletter to be Retired September 30, 2017 -{% endanchor %} - -We will retire Legacy Newsletter on September 30, 2017. This will allow us to better serve your email marketing needs by focusing on supporting and enhancing Marketing Campaigns, the future of email marketing at SendGrid. - -We understand this may impact your business, and want to make the transition as simple as we can. We’re also confident that once you move to Marketing Campaigns, you’ll see even more value out of your email marketing efforts. - -To get started, [take a minute to learn]({{root_url}}/User_Guide/Legacy_Newsletter/index.html) about how Marketing Campaigns and Legacy Newsletter differ—and how you can make the switch today. You’ll find: - -* [FAQs]({{root_url}}/User_Guide/Legacy_Newsletter/faq.html) Legacy Newsletter users have about Marketing Campaigns -* A side-by-side [feature comparison]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/index.html) of Legacy Newsletter vs. Marketing Campaigns -* [Pricing info]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/pricing.html), and much more! - -To make the transition even simpler, when you migrate to Marketing Campaigns you’ll have the option to continue paying $0.25/1,000 emails sent on the [Choose How You Pay]( https://app.sendgrid.com/settings/choose_how_you_pay) page in your account. Note: To be eligible for this pricing offer you need to have sent email via Legacy Newsletter between August 1, 2016 and March 30, 2017. - -Remember, you can get started with Marketing Campaigns at no cost: your first 2,000 contacts are free. - -Kind regards, - -Steve Sloan
-Chief Product Officer - -Want to know what sets Marketing Campaigns apart? Check out this brief video: - -

diff --git a/source/User_Guide/Legacy_Newsletter/migration_checklist.md b/source/User_Guide/Legacy_Newsletter/migration_checklist.md deleted file mode 100644 index abcd37d729..0000000000 --- a/source/User_Guide/Legacy_Newsletter/migration_checklist.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -layout: page -weight: 0 -seo: - title: Migration Checklist - description: -title: Migration Checklist -navigation: - show: true ---- -{% warning %} -Legacy Newsletter is now retired. -As a safety net, you may **retrieve** data for a short grace period. Please act meow to download your data or migrate any assets to Marketing Campaigns. -{% endwarning %} - -For assistance please [contact our support team](https://support.sendgrid.com/). Login to see your contact options. - -{% anchor h2 %} -Moving from Legacy Newsletter to Marketing Campaigns -{% endanchor %} - -The migration to Marketing Campaigns is not automatic. We’ve built a [robust toolkit]({{root_url}}/User_Guide/Legacy_Newsletter/index.html) to help make the manual migration steps fast and simple. This high-level checklist is part of the toolkit and is designed to help you think through important considerations as you make the move to Marketing Campaigns. - -{% anchor h3 %} -1. Familiarize yourself with Marketing Campaigns. -{% endanchor %} - -  ❏ Review the comprehensive [side-by-side comparison]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/index.html) of Legacy Newsletter vs. Marketing Campaigns. - -  ❏ Watch [this video]({{root_url}}/User_Guide/Legacy_Newsletter/index.html) for an introduction to Marketing Campaigns. - -  ❏ Learn about Marketing Campaigns [segmentation capabilities]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html). - -  ❏ Learn about Marketing Campaigns' new and improved [campaign building workflow and editor]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/campaign_building.html). - -  ❏ Practice by creating a test campaign and sending it to yourself. - -{% anchor h3 %} -2. Choose how you'd like to pay. -{% endanchor %} - -  ❏ If you used Legacy Newsletter between 1 August 2016 and 30 March 2017, when you switch to Marketing Campaigns, you can choose how you’d like to pay. You can continue to pay per email sent or you can choose to pay per contact you store in Marketing Campaigns. - -  ❏ Estimate your per-email vs. per-contact cost using [the Marketing Campaigns pricing page]( https://app.sendgrid.com/settings/choose_how_you_pay). If that link does not work for you, log into the app, navigate to **Settings** then **Plan and Billing Details**, then scroll to Marketing Campaigns and click **Learn More**. - -{% anchor h3 %} -3. Migrate your contacts. -{% endanchor %} - -  ❏ Consider which of your contact lists you'd like to migrate. You may wish to use this opportunity to remove old or non-responsive contacts. - -  ❏ Consider how you might segment your contacts and send more targeted, relevant campaigns. - -  ❏ If in use, replace the Legacy Subscription Widget with one of the best-in-class [email list growth integrations for Marketing Campaigns]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_recipient_lists.html#-Replacing-the-Legacy-Newsletter-Subscription-Widget). - -  ❏ Review the [Contact Migration Guide]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_recipient_lists.html) for step-by-step instructions for moving your contacts into Marketing Campaigns. - -  ❏ IMPORTANT! You may have invalid or unsubscribed emails. If you do, ensure you migrate them. Review [Migrating Your Unsubscribes]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_unsubscribes.html) for detailed instructions. - -{% anchor h3 %} -4. Migrate your templates. -{% endanchor %} - -  ❏ Review the [Migrating Your Content]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_content.html) article for details. - -  ❏ Consider starting fresh by customizing one of SendGrid's responsive templates and using the enhanced campaign editor. - -{% anchor h3 %} -5. Migrate your images. -{% endanchor %} - -  ❏ Review the [Migrating Your Content]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_content.html) article. - -  ❏ Review the [Migrating Your Images]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/migrating_images.html) article. - -{% anchor h3 %} -6. Learn about your campaign statistics. -{% endanchor %} - -  ❏ Consider what key metrics and benchmarks are meaningful to your email marketing strategy. - -  ❏ Review the [side-by-side comparison of statistics]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/statistics_reporting.html) in Legacy Newsletter vs. Marketing Campaigns. - -  ❏ Review the [Archiving Legacy Newsletter Statistics]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/downloading_historical_statistics.html) article. - -{% anchor h3 %} -7. Migrate your API integrations. -{% endanchor %} - -If you are using the [Legacy Newsletter API]({{root_url}}/API_Reference/Web_API/Legacy_Features/Marketing_Emails_API/index.html) then we recommend that you migrate your integration to our [Marketing Campaigns API]({{root_url}}/API_Reference/Web_API_v3/Marketing_Campaigns/index.html), the email marketing component of our v3 RESTful Web API. For help with migrating your integration, [please refer our API comparison]({{root_url}}/User_Guide/Legacy_Newsletter/Side_by_Side_Comparisons/api_comparison.html). - -  ❏ [Migrate your Legacy Newsletter Content to Marketing Campaigns.]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.html) - -  ❏ [Migrate your Legacy Newsletter Recipient Lists to Marketing Campaigns.]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.html) - -  ❏ [Migrate your Legacy Newsletter Unsubscribes to Marketing Campaigns.]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.html) - -  ❏ [Download your Legacy Newsletter Statistics via the API.]({{root_url}}/User_Guide/Legacy_Newsletter/Migration_Tutorials/api_migration.html) diff --git a/source/User_Guide/Marketing_Campaigns/Campaigns/a_b_testing.md b/source/User_Guide/Marketing_Campaigns/Campaigns/a_b_testing.md deleted file mode 100644 index 4d8b8cdea5..0000000000 --- a/source/User_Guide/Marketing_Campaigns/Campaigns/a_b_testing.md +++ /dev/null @@ -1,16 +0,0 @@ - - - - Redirecting... - - - - - -

Redirecting...

-

Click here if you are not redirected.

- - - diff --git a/source/User_Guide/Marketing_Campaigns/Campaigns/index.html b/source/User_Guide/Marketing_Campaigns/Campaigns/index.html deleted file mode 100644 index 375621fb65..0000000000 --- a/source/User_Guide/Marketing_Campaigns/Campaigns/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - Redirecting... - - - - - -

Redirecting...

-

Click here if you are not redirected.

- - - diff --git a/source/User_Guide/Marketing_Campaigns/Managing_Contacts/adding_contacts.md b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/adding_contacts.md new file mode 100644 index 0000000000..27f0ea53c7 --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/adding_contacts.md @@ -0,0 +1,132 @@ +--- +layout: page +weight: 90 +title: Adding Contacts +navigation: + show: true +seo: + title: Adding Contacts + keywords: Marketing Contacts, Adding Contacts, Contact Lists + override: true + description: Directions on how to add and manage contacts using Marketing Campaigns +--- +* [Formatting a CSV](#-Formatting-a-CSV) +* [Uploading a CSV](#-Uploading-a-CSV) +* [Manually Add a Contact](#-Manually-Add-a-Contact) +* [Creating a New List](#-Creating-a-New-List) + + + + +From our [Contacts]({{site.marketing_campaigns_url}}/contacts) page, you can add, upload, modify, and delete your contacts. Contacts can be added to your contacts database using the [API](https://sendgrid.com/docs/API_Reference/api_v3.html), or by manually adding or uploading a CSV file through the [SendGrid App](https://app.sendgrid.com/). + +{% info %} +Your first 2,000 contacts are free. After 2,000 contacts, SendGrid charges $10 for every additional 10,000 contacts. +{% endinfo %} + +{% anchor h3 %} +Formatting a CSV +{% endanchor %} + +You can easily add contacts to your contact database by uploading a CSV of your contacts to SendGrid. If you have your contacts in a spreadsheet, simply save that sheet as a .csv file using a spreadsheet application like Microsoft Excel or Google Sheets. You can also export your contacts from most database systems as a .csv file. For more information, see the documentation on [Formatting a CSV](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/formating_a_CSV.html). + +{% anchor h3 %} +Uploading a CSV +{% endanchor %} + +*To add new contacts:* + +1. Click **Add Contacts** and then select **Upload CSV**. +1. Choose an existing list or create a new list. + + If you choose to add the contacts without assigning them to a list, they exist in the contacts database without any additional context. + +1. Upload your file by dragging it into or clicking the CSV upload area. +1. Once the CSV has populated, click **Next:Custom Fields**. + + A page appears displaying the data from the header row from of the CSV file. From the list, you can select a custom field to associate with the data in the column. If there isn't a corresponding field, you can add one. Only the **Email** field is required to complete the upload. Skipped column headers are not uploaded and do not appear as custom fields within an individual contact's profile. + +1. Select **Skip Column** to omit data from the contacts list. +1. Once you've gone through all of the headers, click **Next:Add Contacts**. + +{% info %} +After uploading contacts, you can define segments for individual contacts or lists based on specified criteria. For more information, see [Lists and Segmentation](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.html). +{% endinfo %} + +{% warning %} + The maximum CSV file size is 2GB. +{% endwarning %} + +Once we have completed processing your new contacts, you will receive an email to any addresses specified under [Notifications](https://sendgrid.com/marketing_campaigns/ui/notifications). If there is no email address specified for notifications, the report will go to the address associated with the account by default. To add an additional notification email address, click **Add Notification Email Address** + +![]({{root_url}}/img/add_notification_email_contacts.png "Add Notification Email Address") + +The notification email contains the following information: + +* Total processed contacts +* Number of new contacts +* Number of updated contacts +* Number of errors +* Error messages for each errored row + +If there are any errors, there will be a link to download a CSV containing the errored rows so that you can reformat and reupload those contacts. For more help resolving issues with uploading a CSV, see [Formatting a CSV](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/format_CSV.html). + +{% info %} +The download link to your CSV of errored rows will be available for 24 hours. +{% endinfo %} + +{% info %} +If you upload the same contact more than once, SendGrid updates the data, assuming the most recent upload has the most up-to-date information. Updates to your contacts cannot be rolled back. Multiples of the same contact (as identified by email) can be added to different lists or segments and count as one contact against your total contacts per account or subuser account. +{% endinfo %} + +{% anchor h3 %} +Manually Add a Contact +{% endanchor %} + +*To manually add a contact to your contact database:* + +1. Navigate to **Marketing Campaigns** and then click **Contacts**. +1. In the top right-hand corner, click **Add Contacts**. +1. Click **Manual Add**. +1. Select the list you want to add the contact to from the drop-down, or select **Add to New List** and enter the name of the list. +1. Enter the information for the new contact. +1. Click **Save**. + +{% info %} +To add Custom Field data to a manually imported contact, navigate to the Contact Details page of the new contact. +{% endinfo %} + +{% anchor h3 %} +Creating a New List +{% endanchor %} + +*To create a new list:* + +1. Click **Add Contacts** and then select **Upload CSV**. +1. Click **+Add to New List** and enter the name of the list you would like to create. +1. Choose a CSV file for upload and complete the steps listed in [Uploading a CSV ](#-Uploading-a-CSV). + +{% anchor h3 %} +Add Contacts to a List +{% endanchor %} + +*To manually add contacts to an existing list:* + +1. Navigate to **Marketing Campaigns** and then click **Contacts**. +1. In the top right-hand corner, click **Add Contacts**. +1. Click **Manual Add**. +1. Select the list you want to add the contact to from the drop-down. +1. Enter the information for the new contact. +1. Click **Save Contact**. + +{% info %} +If you [create a segment]({{root_url}}/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.html#-Creating-a-Segment) before you upload a list, contacts that fit the segment criteria populate that segment when uploaded. +{% endinfo %} + +{% anchor h3 %} +Additional Resources +{% endanchor h3 %} + +- [Contacts API](https://sendgrid.com/docs/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.html) +- [Segmenting your Contacts](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/lists.html) +- [Building your Contact list](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/build_contact_list.html) diff --git a/source/User_Guide/Marketing_Campaigns/Managing_Contacts/building_your_contact_list.md b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/building_your_contact_list.md new file mode 100644 index 0000000000..19f6105019 --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/building_your_contact_list.md @@ -0,0 +1,65 @@ +--- +layout: page +weight: 100 +title: Building your Contact list +navigation: + show: true +seo: + title: Building your Contact list + keywords: Marketing Campaigns, Contacts, Contact lists, opt-in email + override: true + description: Directions on how to effectively build your Marketing Campaigns Contact list. +--- +* [Opt-In Email](#-Opt--In-Email) + * [Email opt-in types](#-Email-opt--in-types) +* [Peer-Initiated Email Invitation Requirements](#-Peer--Initiated-Email-Invitation-Requirements) + +The best way to protect your sending reputation and get more messages in the inbox is by building your contact list organically. Here are a few ways SendGrid recommends building your contact list. + +{% anchor h2 %} +Opt-In Email +{% endanchor %} + +Opt-in email refers to bulk email, such as a newsletter or advertisement, that is sent out to a mailing list where every member of that list has actively requested email from the sender. Without obtaining this permission, your email is likely unwanted or unsolicited and is liable to be marked as spam by the recipient or the receiving mailbox provider. + +{% anchor h3 %} +Email opt-in types +{% endanchor %} + +- **Single Opt-in** refers to the practice of requesting permission to send a recipient email during, and only during, registration. +- **Double Opt-in** refers to the practice of requesting permission twice from a recipient. For example, you could ask them if they want to receive email at registration, and then send another email asking them to verify their confirmation. +- **Confirmed Opt-in** refers to the practice of sending emails to your recipients asking them to confirm their continued interest in receiving your future emails. + +{% info %} +To avoid blocked emails, double check the spelling of the emails on your list. SendGrid recommends having the recipient input their address twice to ensure it is correct during the registration/sign-up process. +{% endinfo %} + +{% anchor h2 %} +Peer-Initiated Email Invitation Requirements +{% endanchor %} + +A peer-initiated invitation system can help your subscribers spread the word about your service and grow your user base—if done well. An aggressive invitation system can backfire, and your invitations will be filtered or blocked. SendGrid customers who implement a peer-initiated invitation system must abide by the following requirements: + +* Never allow your subscribers to send invitations to their entire address book. Address books contain old, stale addresses that ISPs use as spam traps. To prevent this, design your invitation system so that your subscriber must deliberately select each invitee. +* Limit the number of invitations each customer can send to encourage selective, quality invitations. When your customers are careful to invite only those who they think will appreciate your service, you reduce the risk of recipients reporting the invitations as spam. If enough people mark your invites as spam, they will be blocked or filtered—not what you intended. +* Clearly display the inviter’s name or email address, so the invitee knows who sent the invitation. (Peer-initiated invitations are most effective when the invitee knows and trusts the inviter.) +* use the inviter’s email address for the invitation emails From address. +* Clearly express the purpose of the invitation. Recipients must understand what they are being invited to. +* After the initial invitation, don’t send more than one follow-up (reminder) email to invitees that didn’t respond to the first invitation. + +SendGrid strongly recommends: + +* Ensuring your invitation is relevant and valued by the recipient. +* Allowing inviters add a personal text-only message to their invitation. (No URLs, as they may be used to exploit or infect the invitee.) +* Including a visible, functioning opt-out link to allow the recipient to remove themselves from future mailings instead of reporting your message as spam. +* Being aware of offering invitation incentives to your subscribers. Incentives may encourage them to invite people who aren’t likely to want your service, and this could backfire. +* Monitoring your spam complaints. Some inviters will trigger spam complaints by sending invitations to people who don’t want them. If your system correlates spam complaints with the troublesome inviter, you can limit their invitation quota to minimize the adverse effect on your email sending reputation. +* Pre-screening the email addresses you collect before you send the invitation. Ensure addresses are syntactically correct, and that the domain part of the address has a DNS MX record (which indicates that the domain accepts mail). + +{% anchor h3 %} +Additional Resources +{% endanchor %} + +- [Lists and Segmentation](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/lists.html) +- [Unsubscribe Groups](https://sendgrid.com/docs/User_Guide/Suppressions/advanced_suppression_manager.html) +- [Custom Fields](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/custom_fields.html) diff --git a/source/User_Guide/Marketing_Campaigns/Managing_Contacts/formating_a_CSV.md b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/formating_a_CSV.md new file mode 100644 index 0000000000..edd8237ac7 --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/formating_a_CSV.md @@ -0,0 +1,132 @@ +--- +layout: page +weight: 80 +title: Formatting a CSV +navigation: + show: true +seo: + title: Formatting a CSV + keywords: Marketing Campaigns Contacts, CSV, Contact Information, Contacts + override: true + description: Directions on how to format a CSV for upload using SendGrid Marketing Campaigns +--- + +* [General Formatting Rules](#-General-Formatting-Rules) + * [Contact Info](#-Contact-Info) + * [Header Row](#-Header-Row) + * [Character Encoding](#-Character-Encoding) + * [Numbers and Text](#-Numbers-and-Text) + * [Date Formatting](#-Date-Formatting) +* [Troubleshooting](#-Troubleshooting) + +You can easily add contacts to your contact database by uploading a CSV into Marketing Campaigns. If you have your contacts in a spreadsheet, simply save that sheet as a CSV file using a spreadsheet application like Microsoft Excel or Google Sheets. You can also export your contacts from most database systems as a CSV file. + +{% anchor h2 %} +General Formatting Rules +{% endanchor %} + +Here are some rules to follow when formatting a CSV to upload into Marketing Campaigns. + +{% anchor h3 %} +Contact Info +{% endanchor %} + +Your CSV should contain the following information about each contact: + +* email (required) +* first_name +* last_name + +You can also include [custom fields](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/custom_fields.html) with additional identifying information for each contact in the CSV. For example, you can specify “country,” “city,” and “age” as the custom fields. The data in the custom fields are critical for both segmentation and content personalization. + +{% anchor h3 %} +Header Row +{% endanchor %} + +The first row of your CSV must be a header row containing labels identifying each column. Headers must only use letters, numbers, and underscores. If you add custom field data to your CSV, you can save some time when uploading by naming the columns the same as the custom fields you have previously defined. + +SendGrid identifies individual contacts by their email address, so "email" must be one of the CSV headers. If you do not include the email column, SendGrid will not add any information to your contact database or list. Rows in your CSV without an email address in the email column will automatically fail, but will not cause the entire upload to fail. + +{% anchor h3 %} +Character Encoding +{% endanchor %} + +If your contacts list has non-English characters, please make sure that you're using a CSV file that is UTF-8 encoded. + +{% anchor h3 %} Not all addresses populate in UI {% endanchor %} + +SendGrid removes duplicate and invalid email addresses (including email addresses with special characters) from your list during upload, so the number of contacts can potentially change between your CSV and your Marketing Campaigns list. + +{% anchor h3 %} Numbers and Text {% endanchor %} + +Make sure that you don’t have text fields that look like numbers. Text that look like numbers are those that contain punctuation characters like a dash, underscore, parenthesis, or multiple dots. + +``` +- US Zip Code: 80202-1713 +- Phone numbers: “(555) 555-5555” or “555.555.5555” +- Monetary Values with the currency indicator such as $3.50 or €5.73 +``` +{% anchor h3 %} CSV Header {% endanchor %} + +- Header fields can be blank in your CSV, but must be named and have their type defined later during the upload process. + +{% anchor h3 %} +Date Formatting +{% endanchor %} + +Properly format any dates in your CSV. If you created your CSV with Excel and it is not displaying properly, force the date format before exporting to CSV. Use one of the following date formats: `MM/DD/YYYY, MM/D/YYYY, M/D/YYYY, or M/DD/YYYY` + +**I have more than one of the same email in my database** + +Marketing Campaigns uses email as the unique identifier for each contact. So, if you upload the same email address multiple times, the [custom field](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/custom_fields.html) data associated with that email will be updated with each upload to the most recently uploaded/updated information. This feature helps prevent you from accidentally emailing the user after they have unsubscribed. + +If it's necessary to have a duplicate entry in your contacts database What you may want to do is add logic to set a custom field, based on the reason why you have duplicate emails in your system (for example multiple product lines) and then [segment](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/lists.html) your user to be in lists based on those custom fields. + +{% anchor h2 %} +Troubleshooting +{% endanchor %} + +Listed below are a few errors you may encounter when uploading a CSV to Marketing Campaigns, along with tips to correct the root issue. + +**We were unable to detect an email column in the CSV file headers. The email column must always have a header of "email"** + +- If there is a header labeled “email”, try moving it to the column A, so it is the first header in your list. +- Your CSV _must_ include an email header. + +![Move email header to colmn A]({{root_url}}/img/listupload_1.png) + +**Some of your custom fields have not been selected** + +- Look for hidden characters in your CSV file if you have worked with the file multiple times and made some adjustments to the data. +- A common fix for this error would be to select all and copy your data to a new CSV spreadsheet. This should remove any hidden characters. + +![]({{root_url}}/img/listupload_2.png) + +**Each custom field can only be applied to a column once. Please check your columns and try again** + +- Check your CSV for duplicate fields, especially fields that have matching information as your “email”, “first_name” and “last_name” fields. You cannot edit these field names as they are reserved. +- For example, if you have a “Name” field, it may conflict with your “first_name” reserved field. + +![]({{root_url}}/img/listupload_3.png) + +**We were unable to detect any headers in your CSV file** + +- Include headers at the top of each column. All CSV uploads must contain the "email" header. Header fields can be blank in your CSV, but must be defined later during the upload process. + +![]({{root_url}}/img/listupload_4.png) + +**Float type conversion error** + +- Categorize dashes or decimal places that are past the hundredth place as text_fields (-100, 123.123 are text fields, 100, 12.12 can be number fields). +Number fields can include monetary values without the currency symbols. For example, 19.95 would be a number field, and $19.95 including the ($) would be a text field. +- As you are uploading your CSV, make sure you select the correct fields for your Field type. + +![]({{root_url}}/img/listupload_table.png) + +{% anchor h3 %} +Additional Resources +{% endanchor %} + +- [Contacts API](https://sendgrid.com/docs/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.html) +- [Segmenting your Contacts](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/lists.html) +- [Building your Contact list](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/build_contact_list.html) diff --git a/source/User_Guide/Marketing_Campaigns/Managing_Contacts/managing_contact_list.md b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/managing_contact_list.md new file mode 100644 index 0000000000..0b390905ff --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/managing_contact_list.md @@ -0,0 +1,120 @@ +--- +layout: page +weight: 80 +title: Managing Contact Lists +navigation: + show: true +seo: + title: Managing Contact Lists + override: true + keywords: Marketing Campaigns Contacts, delete contacts, organize contacts + description: Directions on how to manage contact lists using Marketing Campaigns +--- + * [Viewing a contact](#-Viewing-a-contact) + * [Editing a contact](#-Editing-a-contact) + * [Managing your list](#-Managing-Your-List) + * [Delete unusable contacts](#-Delete-unusable-contacts) + * [Delete a specific contact](#-Delete-a-specific-contact) + * [Delete all contacts](#-Delete-all-contacts) + + + +Managing contacts is an integral part of your marketing campaigns lifecycle. You can create lists for contacts, as well as view and edit each individual contact within your contact database + +{% anchor h2 %} +Viewing a contact +{% endanchor %} + +To view a specific contact profile, find the contact in one of your lists or segments by searching your contact database. Then click the contact’s email address. You will then be able to view the email, engagement data, profile information, custom fields, and list associations for this contact. + +{% info %} +Searches are case agnostic but must be done using a whole email address that includes an "@" and any top-level domain like ".com" or ".io". +{% endinfo %} + +To view any custom fields you have assigned to this contact, or to view any lists that you have added this contact to, you may flip through the tabs beneath the Contact Details. You may either view all custom fields at once, or you can filter them by the following types: “Text”, “Date”, and “Number”. + +{% anchor h2 %} +Editing a contact +{% endanchor %} + +When you are viewing a contact, click any of the Edit buttons to edit the contact's information within that section. This includes the SendGrid provided reserved fields, except email, any custom fields you’ve added for this contact, and any lists the contact is associated with. + +*To edit the associated lists for your contact:* + +1. Select the **Associated Lists** tab. +1. Enter or select the list you would like to use. +1. Click **Add**. + +{% anchor h2 %} +Managing your list +{% endanchor %} + +Sending to a well-managed address list can drastically help improve your delivery. We have put together some simple steps and guidelines that will improve any senders list. + +* [Suppressions](#-Identifying-Suppressions) +* [Delete unusable contacts](#-Delete-unusable-contacts) +* [Delete a specific contact](#-Delete-a-specific-contact) +* [Delete all contacts](#-Delete-all-contacts) + +{% anchor h3 %} +Identifying Suppressions +{% endanchor %} + +In your SendGrid Account there are different [Suppressions]({{root_url}}/User_Guide/Suppressions/index.html) lists. + +**Global Unsubscribes** - Addresses on this list are opted out of all mailing +**Bounces** - Addresses that have failed to deliver to the recipient's inbox. Once an address has been added to this list, we do not attempt to deliver further messages to it, we will instead Drop them to protect your external reputation. +**Spam Reports** - Addresses that have marked your mail as spam +**Blocks** - Addresses that have blocked your mail temporarily, usually due to factors like a blacklisted IP address. You can attempt to resend to these addresses. +**Invalid** - Addresses on this list are malformed and do not have a valid email address structure. (Ex. info.sendgrid.com, info@sendgridcom, info @ sendgrid.com) + +Emails sent to addresses listed in the Bounce, invalid, Spam, and Unsubscribe list are automatically dropped by SendGrid. Feel free to remove these addresses from your lists to save money and time. + +{% anchor h3 %} +Delete unusable contacts +{% endanchor %} + +It is common to have contacts that result in a group unsubscribe, block, bounce, invalid email address, or spam report. Attempting to send email to these contacts can negatively impact your reputation since these contacts do not want to (and will not) receive your marketing emails. + +*To remove all of your unusable Marketing Campaigns contacts:* + +1. When viewing your dashboard, navigate to the left-hand menu and click **Suppressions**. +1. Open a specific group, such as Bounces or Spam Reports, click the action menu in the upper right corner, then select **Download as CSV**. +1. Repeat step 2 for each of the groups that you want to remove (unsubscribes, spam reports, etc.) and merge each of those lists into a single CSV file. +1. Return to your dashboard, navigate to the left-hand menu and select **Marketing**, then **Contacts**. +1. In the upper right corner click **Add Contacts** and select **Upload CSV**. +1. Select **Create New List** and name it something obvious, like "Remove Invalid Emails." +1. Once uploaded, click the action menu to the right of that new list and select **Delete**. +1. Check the box indicating to delete "all contacts associated with this list." + +{% anchor h3 %} +Delete a specific contact +{% endanchor %} + +*To remove one or more contacts from a list:* + +1. Navigate to the {All Contacts list](https://sendgrid.com/marketing_campaigns/ui/all_contacts). +1. Search for the contact you want to delete. +1. Click **delete** to remove the contact permanently. + +{% warning %} +Use this to permanently delete your recipients from all of your contact lists and all segments if required by applicable law. +{% endwarning %} + +{% anchor h3 %} +Delete all contacts +{% endanchor %} + +*To delete all of your contacts at once:* + + 1. Navigate to your [Contacts page](https://sendgrid.com/marketing_campaigns/contacts) and hover over the Action Menu next to All Contacts. + 1. Click the trash can icon. + 1. Select the check box to confirm that you want to delete all contacts and then click **Delete**. + +{% anchor h3 %} +Additional Resources +{% endanchor h3 %} + +- [Lists and Segmentation](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/lists.html) +- [Unsubscribe Groups](https://sendgrid.com/docs/User_Guide/Suppressions/advanced_suppression_manager.html) +- [Custom Fields](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/custom_fields.html) diff --git a/source/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.md b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.md new file mode 100644 index 0000000000..51646efec8 --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.md @@ -0,0 +1,145 @@ +--- +layout: page +weight: 70 +title: Segmenting your Contacts +navigation: + show: true +seo: + title: Segmenting your Contacts + keywords: Segmentation, email segmentation, targeted marketing, email, marketing campaigns + override: true + description: +--- +- [Creating a Segment](#-Creating-a-Segment) +- [Exporting a Segment](#-Exporting-a-Segment) + + + +You can filter the information stored in your [contact lists](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/contacts.html) to create segments. Segmenting contacts using different conditions allows you to create marketing campaigns that directly addresses the wants and needs of a particular audience. You can create a segment that pulls from ALL CONTACTS or a specific existing list. [Custom fields](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/custom_fields.html) allow you to use unique information to identify contacts for different segments. +Segments are dynamically updated over time as you add contacts who meet the criteria of your segment, or as the traits of your contacts change. For example, a segment with the criteria ”opened an email within 30 days” will evolve as contacts engage (or don’t engage) with your email. + +{% anchor h2 %} +Creating a Segment +{% endanchor %} + +You can create a new segment with multiple conditions based on the information you have stored about your contacts, and based on some of the information SendGrid has stored about your Marketing Campaigns. + +{% info %} +You can create up to 200 segments. +{% endinfo %} + +*To create a segment:* + +1. Navigate to **Marketing** and then select **Contacts**. +1. Click **Create Segment**. +1. Choose **Segment all contacts** or **Segment an existing list**. +1. Enter a *Segment Name*. +1. To segment an existing list, select a list from the *Select List to Segment* drop-down. +1. From the *Condition* drop-down, choose the desired condition or custom field. +1. From the *Criteria* drop-down, choose from a list of available operators based on the chosen condition. + + +For example, to create a segment of recipients that have clicked on a link in a specific marketing campaign: + +1. Navigate to **Marketing** and then select **Contacts**. +1. Click **Create Segment**. +1. Choose **Segment all contacts** or **Segment an existing list**. +1. Enter a *Segment Name*. +1. From the *Condition* drop-down, select **Engagement:Clicks**. +1. From the *Criteria* drop-down. select **clicked**. +1. From the last drop-down, select the name of the campaign you want to use for the segment. + +{% info %} +The *Condition* drop-down contains required CSV fields, custom fields, and internal event data to help you get your email campaigns to the correct audience. The *Criteria* drop-down contains operators that tell the segment *how* to handle the data sepcified by the condition. +{% endinfo %} + + Depending on which condition is selected, the criteria you can choose from differ. The criteria available to assign to conditions will depend on the field type (Text, Date, or Number). For example, a condition labeled "Number” will show `GREATER THAN`, `LESS THAN`, and `EQUALS` as options whereas a “Text” field will show `IS` and `IS NOT` as options. + + ![]({{root_url}}/img/Segmentation.png "Segmentation conditions and criteria") + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Criteria Description
isdata matches the text input exactly
is notthe data does not match the text input exactly
contains worddata includes the text input
is beforethe date of the event is before the date selected
is afterthe date of the event is after the date selected
is withinthe date of the event is within a selected date range
is emptythe condition or field is empty in the database
is not emptythe condition or field is not empty in the database
openedthe contact opened an email from a campaign
not openedthe contact did not open an email from a campaign
clickedthe contact clicked a link within a campaign
not clickedthe contact did not click a link within a campaign
+ +
+When using more than one condition to segment your contacts, you can select `AND` or `OR` as options, where `AND` requires both conditions to be true and `OR` requires either condition to be true. Once you’ve selected the Condition and the Criteria, you can layer additional conditions in the segment to narrow the results to a more targeted audience. + +{% info %} +You can add up to 15 different conditions per segment. +{% endinfo %} + +{% anchor h3 %} +Exporting a Segment +{% endanchor %} + +*To export a Segment:* + +1. Click the Action Menu next to the name of the segment you wish to export. +1. Select **Export**. + +This triggers SendGrid to send an email to the primary email address on the account that includes a link to +download the CSV of all the contacts in the list and their associated custom field values. + +{% info %} +The download link for your CSV export will be valid for 24 hours. +{% endinfo %} + + +{% anchor h3 %} +Additional Resources +{% endanchor h3 %} + +- [Contacts](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/contacts.html) +- [Custom Fields](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/custom_fields.html) +- [Tips on Segmenting Your Active Subscribers](https://sendgrid.com/blog/tips-on-segmenting-your-active-subscribers/) diff --git a/source/User_Guide/Marketing_Campaigns/Old_Editor_Sunset.md b/source/User_Guide/Marketing_Campaigns/Old_Editor_Sunset.md new file mode 100644 index 0000000000..84c2e6320a --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/Old_Editor_Sunset.md @@ -0,0 +1,71 @@ +--- +layout: page +weight: 11 +title: Old Editor Sunset +navigation: + show: true +seo: + title: Marketing Campaigns - Old Editor Sunset + override: true + description: On 16 April 2018, the old Marketing Campaigns editor is going away. +--- +{% warning %} +On 16 April 2018, SendGrid will be discontinuing the old Marketing Campaigns editor. At that time, all campaigns will be opened and edited in the powerful new Marketing Campaigns experience. + +Some maintenance may be required when moving an old campaign in the new editor for the first time. We strongly encourage you to move any remaining campaigns into the new editor by 16 April, 2018 to ensure your sending is not interrupted when the deprecation occurs. +{% endwarning %} + +{% anchor h2 %} +Additional Details +{% endanchor %} + +{% anchor h3 %} +Why is the old editor going away? +{% endanchor %} + +Marketing Campaigns was built to empower Marketers to send beautiful messages that recipients love. In August 2017, SendGrid announced a [new, updated editing experience for Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html). The new experience was built on the success of the old editor and is focused on supporting your unique worflow. Since August, thousands of users have discovered the power, flexibility, and speed of the new editors. + +The new Marketing Campaigns editors offer a markedly better experience for crafting email campaigns. They feature increased stability, more powerful features, and a streamlined, flexible workflow that saves time. With the vast majority of users already taking advantage of the new experience, our team is dedicated to investing fully in the new Marketing Campaigns editors going forward. + +{% anchor h3 %} +How do I know if I'm using the old or new editor? +{% endanchor %} + +It’s likely that you’re already using the new Marketing Campaigns editing experience. Since August 2017, the only way to still access the old editor has been to duplicate a campaign that was originally created in that editor. If you’re using the old editor, you will notice a bar at the top of the screen that tells you that you’re in the old experience. + +{% anchor h3 %} +I am still using the old editor. What do I need to do? +{% endanchor %} + +Until 16 April 2018, if you duplicate a campaign that was originally created within the old editor, you will notice an alert banner at the top of the app. You can click the button within the alert to begin moving your campaign into the new editing experience. + +On 16 April 2018, if you duplicate a campaign that was originally created within the old editor, it will require you to open the campaign in one of the [new editors]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html). While many campaigns will move over seamlessly, it’s possible that – depending how you’ve edited your campaign in the past – you’ll need to make a few tweaks or take a few moments to rebuild a template in the new editor. Rest assured, creating templates in the new editor is quick and easy – in most cases, taking only a few minutes. That said, if you have any issues at all, our [support team is available](https://sendgrid.com/support)! + +{% anchor h3 %} +I use both Design and Code. Why do I need to choose one? +{% endanchor %} + +Good news! If you like to build your campaigns visually, but like to roll up your sleeves to edit some code to make it perfect, the Design Editor will a great option for you. While it's called the "Design Editor," this experience still features a number ways to access and edit HTML. Each visual drag and drop module in the new builder features one-click access to your HTML content. To access, click the action menu at the top of the blue bar in each drag-and-drop module and then select the `< >` icon to get to your code. Learn more about the [new editing experience]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html). + +{% info %} +If you’ve edited code in your current template but want to use it with the new visual, drag and drop editor, you will need to add our [Drag-&-Drop Markup]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html#-Importing-Custom-HTML-With-Drag--Drop-Markup). +{% endinfo %} + +{% anchor h3 %} +I moved my campaign to the new editor, but something looks weird. +{% endanchor %} + +Depending on how you created and edited your campaign in the old experience, some maintenance may be required when moving an old campaign in a new editor for the first time. This is due to some improvements that we made with the new experience – particularly around how HTML is handled and protected. + +While these improvements offer far greater stability and speed for the long term, we know that these initial changes can be a bit frustrating. To help, we've identified two possible scenarios when migrating a campaign into the new editor, with some details on how to resolve these issues, below: + +**I have a custom coded template, but want to use the Design Editor:** +
If you get custom code from your designer or developer and want to use it with our powerful new drag-and-drop Design editor, you can! First, our Design editor needs to be able to understand what kind of content blocks are in your email, and how it should group your content. To do this, you (or your developer) will need to add some of our [Drag and Drop Markup]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html#-Importing-Custom-HTML-With-Drag--Drop-Markup) to the code. + +**When I opened the new editor, my entire email got dropped into one big code module:** +
If you created a campaign using drag-and-drop modules in the old editor, but then edited some of the code yourself, this can cause the Design editor to view your email as a single block of code. If this is the case, we recommend that you take a few minutes to rebuild the campaign in the new drag-and-drop editor. This will ensure that your campaigns are stable, clean and any bugs from the old editor aren't copied over into the new experience. + +{% anchor h2 %} +We're here to help +{% endanchor %} +We're excited for all of the new value that you're going to experience with the new editor. As always, if you have any questions or concern, our [Support team](https://support.sendgrid.com) is standing by to help. diff --git a/source/User_Guide/Marketing_Campaigns/a_b_testing.md b/source/User_Guide/Marketing_Campaigns/a_b_testing.md index 75ff16c740..8ca6d2eee4 100644 --- a/source/User_Guide/Marketing_Campaigns/a_b_testing.md +++ b/source/User_Guide/Marketing_Campaigns/a_b_testing.md @@ -1,86 +1,145 @@ --- layout: page weight: 50 -title: A/B Testing +title: A/B Testing Your Campaign navigation: show: true seo: - title: A/B Testing Marketing Campaigns + title: A/B Testing Your Campaign override: true - description: + description: Optimize engagement of your campaigns with A/B testing, by sending different versions of your emails to a small subset of your contacts and measuring the engagement results. --- +Optimize the engagement of your Marketing Campaigns with A/B testing. A/B testing allows you to send different versions of your emails to small subsets of your contacts. + +When recipients interact with the A/B test emails, you can compare the engagement metrics and choose the version to send to the remainder of your contacts, or allow SendGrid to automatically choose the winning version of your campaign according to the A/B test criteria you set. + +- [Set up an A/B test](#-Set-up-an-AB-test) +- [Choose the Type of A/B Test To Run](#-Choose-the-Type-of-AB-Test-To-Run) +- [Adding Your Email Versions](#-Adding-Your-Email-Versions) +- [Select the A/B Test Campaign Sample Size](#-Select-the-AB-Test-Campaign-Sample-Size) +- [Determine the Winning Criteria for the A/B Test](#-Determine-the-Winning-Criteria-for-the-AB-Test) +- [Set the A/B Test Duration](#-Set-the-AB-Test-Duration) +- [Pick and Send the Winning A/B Test Variation](#-Pick-and-Send-the-Winning-AB-Test-Variation) +- [A/B Testing FAQ](#-AB-Testing-FAQ) + -You may want to test the email that you are sending to your customers in order to optimize engagement from them. A/B testing in Marketing Campaigns works by sending versions of your emails to small subsets of your contacts. When your contacts interact with the emails according to the criteria you set, SendGrid will send the winning version of your campaign to the remainder of your contacts. +{% anchor h2 %} Set up an A/B test {% endanchor %} -![]({{root_url}}/images/ab_testing_1.png "A/B Testing") + *To set up an A/B test on an existing campaign:* -{% anchor h3 %} -Subject Testing vs. Content Testing -{% endanchor %} +1. From the left-hand navigation, select **Marketing**, and then click **Campaigns**. +1. Locate the campaign you want to A/B test and click on the campaign to open it in the editor it was created in. +1. Depending on the editor used to create the campaign, A/B testing is located on either the *Settings* tab or the *A/B Testing* tab. +1. Once you have located the A/B Testing settings, toggle the *Activate A/B Testing* switch to **ON**. -When you are A/B testing your email campaigns, you will want to optimize for a specific metric, whether it's opens, clicks, or something else of your choosing. +{% anchor h2 %} Choose the Type of A/B Test To Run {% endanchor %} -Subject testing caters more to open rate, because the subject is usually all the recipient sees until they open their email. So if you have high open rates, that’s generally a reflection of the strength of your subject line. Once you find a subject that works well, you will potentially see other engagement metrics improve as well. +When you are A/B testing your email campaigns, you want to optimize for a specific metric. Determine whether you want to optimize your Open Rates, by testing the Subject Line; or your Click Rates, by testing the Email Content. -Content testing caters more to click rate, because the recipient will not see this content unless they open the email. If you have high click rates, it generally means that you have compelling content and calls to action (CTAs). +{% info %} +You can test up to 6 different variations for each A/B test campaign. +{% endinfo %} -{% anchor h3 %} -Selecting A/B Testing Criteria -{% endanchor %} +- **Subject Line - Optimize Open Rates** + + Select the Subject Line A/B test to optimize the [Open Rate]({{root_url}}/Glossary/open_rate.html) of your email campaign, since the subject usually is all the recipient sees until they open your email. + + High open rates shows the strength of a subject line. Once you find a subject line that works well, you will potentially see other engagement metrics improve as well. + +- **Email Content - Optimize Click Rates** + + Select the Email Content A/B test to optimize the Click Rate of your email campaign, since the recipient will not see this content unless they open your email. + + High click rates means that you have compelling content and calls to action (CTAs). + +{% anchor h2 %} Adding Your Email Versions {% endanchor %} + +Enter the different versions of your email where you would normally edit that piece of content in you email campaign. + +- **Subject Line Testing** + + For subject line testing, you will find multiple input boxes in the sidebar where you would normally find your subject line, one for each subject line variation. + +- **Email Content Testing** + + For email content testing, you will see additional tabs at the top of the content area, one for each email content variation. The number of tabs you see will depend on how many versions you have decided to test. + + Make edits to each of your email content variations by selecting one of the tabs. {% info %} -You can test up to 6 variations of your campaign. +**A/B Testing Tip - Adding Variations** + +To know the direct cause for the best performing variation, only make one change per variation rather than many changes. That way you can point to a direct cause for the differences in your stats. {% endinfo %} -**Activate A/B Testing** - When you view the “Testing” tab, by default A/B testing will be turned off. Click the button that says “Off” to toggle this feature on. +{% anchor h2 %} Select the A/B Test Campaign Sample Size {% endanchor %} -**Test Versions Of** - Select whether you want to test the subject or the content. +Choose percentage of your contact list that will participate in the A/B test. -**Test Size** - The percentage of your list that should get each variation. Each variation will be sent to the same number of contacts. +Each variation of the email will be sent to the same number of contacts, within the participating subset of your list. -**Selecting a Winner** -Open Rate - This is the rate at which your recipients open your emails. -Click Rate - This is the rate at which your recipients click links in your emails. +{% anchor h2 %} Determine the Winning Criteria for the A/B Test {% endanchor %} -Manual - You will be notified by email when the test duration time has passed. At that time, you can choose your winner manually. The campaign will not be sent to all recipients until you choose a winning variation. +- **Open Rate** -**Duration** - The time to test your variation, ranging from 30 minutes to 24 hours. While you can test your variations for up to 24 hours, only the subset of emails you've chosen to test will be sent before that duration is up. This means that you should be mindful of your test duration with respect to the timeliness of your campaign content. For example, if you have a one-day sale that happens the day of your campaign, you should set the duration so that your customers get the campaign the same day as the sale. + SendGrid automatically selects the winning variation based on how many recipients [open]({{root_url}}/Glossary/opens.html) your email. -{% anchor h3 %} -Adding Your Versions -{% endanchor %} +- **Click Rate** + + SendGrid automatically selects the winning version based on how many recipients [click]({{root_url}}/Glossary/clicks.html) links and engage with the content in your email. + +- **Manual** + + Allows you to select the version you think best engages with your customers after reviewing the results of the A/B Test. -In all cases, your versions will be located in the same place where you would normally edit that piece of your campaign. -For subject testing, you will find multiple input boxes, one for each variation, in the sidebar where you would normally find your single subject line. +{% anchor h2 %} Set the AB Test Duration {% endanchor %} + +You can set your A/B test duration between 30min - 24 hours. + +While you can test your email variations for up to 24 hours, emails will only be sent to the subset of contacts you've chosen to participate in the A/B test, during the test duration you set. The remainder of your contacts will only be sent the winning variation of your A/B test email after the test duration has completed. {% info %} -To know the direct cause for the best performing variation, it typically makes sense to make one change per variation rather than many changes. That way you can point to a direct cause for the differences in your stats. -{% endinfo %} +**A/B Testing Tip - Setting the Test Duration** -For content testing, you will be able to make edits to each of your variations by selecting one of the tabs at the top of the content area. The number of tabs you see will depend on how many versions you have decided to test. +You should be mindful of your test duration, with respect to the timeliness of your campaign content. -{% anchor h3 %} -Sending The Winner -{% endanchor %} +For example, if you have a one-day sale that happens the day of your campaign, you should set the A/B test duration to less than 24 hours so that your remaining contacts still have time to get the final email campaign, and participate in your oney-day sale. +{% endinfo %} + +{% anchor h2 %} Pick and Send the Winning A/B Test Variation {% endanchor %} When a variation wins, based on your criteria and duration, you will be notified that a winner was chosen and which variation won. -![]({{root_url}}/images/ab_testing_4.png "Manually choose a test winner") +- **Automatically Send the Winning Version** + + If you chose to determine the A/B test winning crietria based on Open Rate or Click Rate, SendGrid will automatically send the winning email variation to the rest of your list. + + You can also manually choose a winner at any time after you start the test. -You can also manually choose a winner at any time after you start the test. + ![]({{root_url}}/images/ab_testing_4.png "A/B test winner") -![]({{root_url}}/images/ab_testing_2.png "Manually choose a test winner") +- **Manually Picking the Winning Version** -If you choose to manually pick a winner, (meaning SendGrid is not automatically choosing based on click or open rate), then you will be notified via email at the end of the duration you set, that your test is complete and that you need to choose a winner. + If you chose to Manually determine the A/B test winning criteria (meaning SendGrid is not automatically choosing based on Open Rate or Click Rate), you will be notified by email when the test duration time has passed. At that time, you need to choose your winner manually. -![]({{root_url}}/images/ab_testing_3.png "Choose a winner badge") + ![]({{root_url}}/images/ab_testing_3.png "Choose a winner badge") + + ![]({{root_url}}/images/ab_testing_2.png "Manually choose a test winner") + +{% info %} +**A/B Testing Tip - Manually Picking the Winning Variation** + +If you chose to Manually determine the A/B test winning criteria, you need to remember to manually choose the winning email variation. The remainder of your contacts will not be sent the email campaign until you choose a winning variation. +{% endinfo %} {% anchor h3 %} Additional Resources {% endanchor h3 %} - [Campaign Statistics](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/campaign_stats.html) +- [Design Editor]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html) +- [Code Editor]({{root_url}}/User_Guide/Marketing_Campaigns/code_editor.html) diff --git a/source/User_Guide/Marketing_Campaigns/beta_editors.md b/source/User_Guide/Marketing_Campaigns/beta_editors.md deleted file mode 100644 index 75bb03edae..0000000000 --- a/source/User_Guide/Marketing_Campaigns/beta_editors.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -layout: page -weight: 81 -title: New Editing Experience -navigation: - show: true -seo: - title: New Editing Experience - override: true - description: With SendGrid Marketing Campaign’s new editing experience you now have complete control over your editing environment--you can choose between an optimized visual design editor and a pure HTML code editor. ---- - - - - - -{% anchor h2 %} -What is the new campaign and template editing experience? -{% endanchor %} - -With SendGrid Marketing Campaign’s new editing experience you now have complete control over your editing environment: you can choose between an optimized visual design editor and a pure HTML code editor. - -The **code editor** provides users who are importing, editing, or crafting custom HTML a robust environment to upload images, write HTML, and configure their campaign without interference from HTML generating WYSIWYG tools. - -The **design editor** offers users powerful drag & drop WYSIWYG editing tools making it possible for anyone to build beautiful emails, regardless of HTML knowledge. For those familiar with HTML looking to leverage the design editor you can modify the HTML of individual content modules. - -For more information on getting started with the new editing experience, check out: - -* [Sending an Email]({{root_url}}/User_Guide/Marketing_Campaigns/getting_started.html) -* [Using the Design Editor]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html) - * [Getting Started With the Design Editor]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Getting-Started-With-the-Design-Editor) - * [Using Drag & Drop Modules]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Using-Drag-&-Drop-Modules) - * [Drag & Drop Module Descriptions and Styles]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Drag-&-Drop-Module-Descriptions-and-Styles) - * [Using Global Styles]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Using-Global-Styles) - * [Editing Module HTML]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Editing-Module-HTML) - * [Code Modules]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Code-Modules) - * [Adding Images]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Adding-Images) - * [Using Substitution Tags]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Using-Substitution-Tags) - * [Previewing Your Campaign]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Previewing-Your-Campaign) - * [Editing the HTML Head]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Editing-the-HTML-Head) - * [Importing Custom HTML With Drag & Drop Markup]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Importing-Custom-HTML-With-Drag-&-Drop-Markup) - * [Drag & Drop Markup]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Drag-&-Drop-Markup) - * [Drag & Drop Code Examples]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Drag-&-Drop-Code-Examples) - * [Exporting HTML From the Design Editor]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Exporting-HTML-From-the-Design-Editor) -* [Using the Code Editor]({{root_url}}/User_Guide/Marketing_Campaigns/code_editor.html) - * [Getting Started with the Code Editor]({{root_url}}/User_Guide/Marketing_Campaigns/code_editor.html#-Getting-Started-with-the-Code-Editor) - * [Uploading Images]({{root_url}}/User_Guide/Marketing_Campaigns/code_editor.html#-Uploading-Images) - * [Using Substitution Tags]({{root_url}}/User_Guide/Marketing_Campaigns/code_editor.html#-Using-Substitution-Tags) - * [Previewing Your Campaign]({{root_url}}/User_Guide/Marketing_Campaigns/code_editor.html#-Previewing-Your-Campaign) -* [Marketing Templates]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html) - * [Creating a New Template]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Creating-a-New-Template) - * [Editing an Existing Template]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Editing-an-Existing-Template) - * [Duplicating a SendGrid Template]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Duplicating-a-SendGrid-Template) - * [Duplicating a Custom Template]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Duplicating-a-Custom-Template) - * [Creating a Template from a Campaign]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Creating-a-Template-from-a-Campaign) -* [Frequently Asked Questions](#-Frequently-Asked-Questions) - -{% anchor h2 %} -Frequently Asked Questions -{% endanchor %} - -{% anchor h3 %} -How do I use the templates I created in the previous editor? -{% endanchor %} - -When you open one of your existing campaigns or templates in the new editor, SendGrid creates a duplicate of the original campaign or template. You may always open the original campaign or template in the previous editor. - -{% anchor h3 %} -What happens to my exisiting campaigns and templates? -{% endanchor %} - -For now, you can continue to open your campaigns and templates in the previous editor. When you open a campaign or template you created in the previous editor in the new editor, it makes a duplicate of that campaign or template and opens it in the editor. You can't open the duplicate in the previous editor, but you can open your originals in the prvious editor. - -{% anchor h3 %} -Can I use both editors? -{% endanchor %} - -When opening a pre-existing campaign or template, you are given the option of opening the duplicate of that campaign or template in either the design editor or the code editor. Once you have made your selection, you will not be able to switch between the design and code editors when editing _that specific campaign or template_. - - -{% anchor h3 %} -Can I open a campaign or template created in the new editor with the previous editor? -{% endanchor %} - -You cannot open a campaign/template created in the new editor with the previous editor. Any new campaigns/templates created in the new editor will only be accessible from the new editor. However, you can still open your existing campaigns/templates in the previous editor. - -{% anchor h3 %} -Why did I get the error "We were unable to detect any drag & drop modules?" -{% endanchor %} - -If you want to import HTML containing drag & drop compatible modules, it is important that you structure your content according to the [format explained here]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Using-Custom-HTML). - -If you receive the error “We were unable to detect any drag & drop modules”, first ensure that you include the following attributes in your HTML: - -* The attribute `role=“modules-container”` must be included in all elements containing drag & drop modules -* Every drag & drop module must include the attribute `role=module` - -If you continue to receive an error, please refer to our [example HTML for building a drag & drop module]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html#-Using-Custom-HTML). diff --git a/source/User_Guide/Marketing_Campaigns/campaign_stats.md b/source/User_Guide/Marketing_Campaigns/campaign_stats.md index 415d806dc3..a609c58e7f 100644 --- a/source/User_Guide/Marketing_Campaigns/campaign_stats.md +++ b/source/User_Guide/Marketing_Campaigns/campaign_stats.md @@ -12,7 +12,7 @@ seo: -*[Viewing Campaign Statistics](#-Viewing-Campaign-Statistics) +* [Viewing Campaign Statistics](#-Viewing-Campaign-Statistics) * [Exporting Campaign Statistics](#-Exporting-Campaign-Statistics) * [Exporting Statistics for Multiple Campaigns](#-Exporting-Statistics-for-Multiple-Campaigns) * [Leveraging Engagement Statistics](#-Leveraging-Engagement-Statistics) @@ -87,7 +87,7 @@ Creating a Segment Based on Your Engagement Metrics 1. From the Campaigns page or the individual campaign stats page, hover over the **Unique Opens** or **Unique Clicks** stats. 1. Click **View Details** and then select **Create Segment**. - A window opens with segmentation options. By default, the segment will contain the conditions to capture all recipients who either opened your campaign or clicked within your campaign. The segment will be given the name _“Contacts who [clicked/opened] [your campaign name]”_. You can rename this segment or modify the conditions of the segment as you wish directly in this window. For more information on segmentation, [click here]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html#-Create-a-Segment). + A window opens with segmentation options. By default, the segment will contain the conditions to capture all recipients who either opened your campaign or clicked within your campaign. The segment will be given the name _“Contacts who [clicked/opened] [your campaign name]”_. You can rename this segment or modify the conditions of the segment as you wish directly in this window. For more information on segmentation, [click here]({{root_url}}/User_Guide/Marketing_Campaigns/Managing_Contacts/segmenting_your_contacts.html#-Creating-a-Segment). 1. Click **Save**.
You now have a dynamic segment that will continuously update as recipients engage with this campaign. @@ -104,3 +104,10 @@ In addition to creating a dynamic segment based on campaign engagement as descri 1. Click **View Details**.
A real-time list of all recipients who either opened your campaign, or clicked a link within your campaign appears. 1. Click **Export CSV**. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Sending a Campaign](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/getting_started.html) +- [A/B Testing Your Campaign](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/a_b_testing.html) diff --git a/source/User_Guide/Marketing_Campaigns/code_editor.md b/source/User_Guide/Marketing_Campaigns/code_editor.md deleted file mode 100644 index f7457d3e60..0000000000 --- a/source/User_Guide/Marketing_Campaigns/code_editor.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -layout: page -weight: 75 -title: Code Editor -navigation: - show: true -seo: - title: Code Editor - override: true - description: ---- - -Use the Code Editor to create a template, edit a SendGrid template, or build a campaign with your own custom HTML. With helpful features like preview, tag completion, and error flagging, you can confidently edit your HTML. - -* [Getting Started with the Code Editor](#-Getting-Started-with-the-Code-Editor) -* [Uploading Images](#-Uploading-Images) -* [Using Substitution Tags](#-Using-Substitution-Tags) -* [Previewing Your Campaign](#-Previewing-Your-Campaign) - - -{% anchor h2 %} -Getting Started with the Code Editor -{% endanchor h2 %} - -1. From the left-hand navigation, select **Marketing**, and then click **Campaigns**. - -1. Click **Create Campaign**. To create a campaign from an existing one, find the version you want to use and click the **action menu** next to the campaign and then select **Edit** or **Duplicate**. - - ![]({{root_url}}/images/duplicate_campaign.png) - -1. Select the template that you want to use for your campaign. You can select a Blank Template, a custom template that you have already created, or one of SendGrid's pre-built templates. For more information, see [Working With Templates](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/templates.html). - -1. Select **Code Editor**, and then click **Continue**. - - If you have already built the HTML that you want to use in another application, copy and paste that code directly into the content area of the code editor. You can also write the HTML for your campaign or template directly in the code editor. The code editor has predictive text completion, color-coded syntax highlighting, and detailed error messages. - -1. Preview your campaign or template by clicking **Preview**. - -You can toggle between a preview of how your campaign or template will appear on a recipient's desktop and mobile phone by clicking either the desktop or mobile phone icons above the content area. You can also view a plain-text version of your campaign or template by clicking the **T** icon. When in this preview mode, you can edit the plain text content of your campaign or template by clicking the **Edit Plain Text** button. - -{% warning %} -Once you create a new campaign or template in the Code Editor, you cannot switch to the Design Editor. -{% endwarning %} - -{% anchor h2 %} -Uploading Images -{% endanchor h2 %} - -1. Select the **Images** tab, and click **Manage Image Library**. A window opens where you can upload images to your image library. - -1. Select the image you want from your image library. The Image Details tab appears. - -1. Copy the URL in the **Image Source URL** tab by clicking **Copy URL**. - -1. Paste this URL in the image source tag in your campaign or template's HTML. For example: `` - -{% anchor h2 %} -Using Substitution Tags -{% endanchor h2 %} - -Substitution tags allow you to easily generate dynamic content for each recipient on your contact list. When you send to a list of recipients you can specify substitution tags specific to each recipient. - -**To add a substitution tag to your campaign:** - -1. Navigate to the **Tags** tab. - -1. Locate the tag you want to add to your campaign and click the **copy** icon. - -1. Paste the tag into the module. - -You can add the following substitution tags to your marketing campaign: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Substitution TagDescriptionType
`[%email%]`The email address of the recipientPersonalization
`[%first_name%]`The first name of the recipientPersonalization
`[%last_name%]`The last name of the recipientPersonalization
`[Sender_Name]`The name of the sender selected when sending your campaignSender Identity
`[Sender_City]`The city on record for the sender selected when sending your campaignSender Identity
`[Sender_State]`The state on record for the sender selected when sending your campaignSender Identity
`[Sender_Zip]`The zip code on record for the sender selected when sending your campaignSender Identity
`[Unsubscribe]`This tag will be replaced with a link allowing your recipient to be added to the unsubscribe group selected when sending your campaign.Unsubscribe
`[Unsubscribe_Preferences]`This tag will be replaced with a link allowing your recipients to opt into or out of the various email unsubscribe groups you offer.Unsubscribe
`[Weblink]`This tag will be replaced with a link allowing your recipients to view your campaign content directly within their web browser.Weblink
- -For contacts with no entry in a custom field, the substitution tag appears blank. To set a default value, use the following pattern: - -`[%first_name | Valued Customer%]` - -{% anchor h2 %} -Previewing Your Campaign -{% endanchor h2 %} - -To preview your campaign or template, click the **Preview** button in the upper-left corner. - -You can toggle between a mobile and desktop preview mode by clicking either the desktop or mobile phone icons above the content area. - -To view a plain text version of your campaign or template, click the **T** icon. When in this preview mode, you can edit the plain text content of your campaign or template by clicking the **Edit Plain Text** button. - - -When previewing a campaign, you will also see a preview of the From name, the Subject, and the preheader text that you have selected. - -{% anchor h3 %} -Additional Resources -{% endanchor h3 %} - -- [A/B Testing](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/a_b_testing.html) -- [Campaign Statistics](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/campaign_stats.html) -- [Design Editor](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/design_editor.html) diff --git a/source/User_Guide/Marketing_Campaigns/contacts.md b/source/User_Guide/Marketing_Campaigns/contacts.md deleted file mode 100644 index 35c68bce43..0000000000 --- a/source/User_Guide/Marketing_Campaigns/contacts.md +++ /dev/null @@ -1,232 +0,0 @@ ---- -layout: page -weight: 65 -title: Contacts -navigation: - show: true -seo: - title: Contacts - override: true - description: ---- - - - -Managing contacts is an integral part of your marketing campaigns lifecycle. From our [contacts]({{site.marketing_campaigns_url}}/contacts) page, you can add, upload, and delete your contacts. - -{% info %} -Your first 2,000 contacts are free. -{% endinfo %} - -To add your contacts, just click the "Add List" or "Segment" button and then select your upload method. For information about how many contacts come with your package, please refer to our [pricing page]({{site.pricing_url}}). - -![]({{root_url}}/images/add_list_or_segment_button.png) - -{% info %} -SendGrid requires that your contacts have given you explicit permission to email them. We do not allow purchased or rented lists. Please see our [email policy](https://sendgrid.com/email_policy) for more details. -{% endinfo %} - -{% anchor h2 %} -Manually Add a Contact -{% endanchor %} - -In order to manually add a single contact straight to your contact database, just click the “manual” tab on the upload window. You will then be able to add the information for your contact. - -{% anchor h2 %} -Uploading Contacts -{% endanchor %} - -Contacts can be added to your contacts database via the API or using a CSV file through the SendGrid Customer Portal. If you have any issues, please see our Troubleshooting Guide. - -{% warning %} -Email is the unique identifier for your Contacts Database. This means you cannot add the same email to your user's contacts database twice, doing so will cause the original record to update all fields passed to the information in the most recent update. Updates to your contacts cannot be rolled back. -{% endwarning %} - -{% anchor h3 %} -Prepare Contacts for Upload -{% endanchor %} - -{% warning %} -Your CSV file MUST be in UTF-8 format. -{% endwarning %} - -You can easily add contacts to your contact database by uploading a CSV of your contacts to SendGrid. If you have your -contacts in a spreadsheet, simply save that sheet as a .csv file using a spreadsheet application like Microsoft Excel or -Google Spreadsheets. You can also export your contacts from most database systems as a .csv file. - -Your CSV should have the contacts you want to upload into the Marketing Campaigns app, as well as their respective custom fields. For example: email, first_name, last_name, country, city, age - where “country,” “city,” and “age” are your custom fields. - -The first row of your CSV must always be a header row which will identify the columns of your contacts. We have provided [an example CSV file]({{root_url}}/assets/example.csv) for you to look at. The first row of the file is the header row. All headers must only use letters, numbers, and underscores. If you add custom field data to your CSV, while it’s not a requirement to do so, you can save yourself some time on upload by naming the columns the same as the custom fields you have previously defined in the Marketing Campaigns customer portal. - -{% info %} -You must include ```email``` as one of your CSV headers because that is how we identify individual contacts. If you do not include the email column, we will not add any information to your contact database or list. Also, it should be noted that any rows in your CSV without an email address in the email column will automatically fail, but will not cause the entire upload to fail. -{% endinfo %} - -{% anchor h3 %} -Upload Your Contacts -{% endanchor %} - -You can add contacts by uploading the CSV you prepared in a previous step. If you happen to upload the same contact more than once, we will append or update any data, assuming the most recent upload has the correct and most up to date information. - -{% info %} -We will never create a duplicate contact in your contact database or add a contact more than once to any list or segment. -{% endinfo %} - -{% anchor h3 %} -Add Contacts From a CSV -{% endanchor %} - -To add new contacts, select “Add Contacts” and then select “Upload CSV.” Select your file by dragging a file into or clicking the CSV upload area which says “Drag and drop your CSV here or select it from your computer.” - -{% warning %} -The maximum uploadable file size of your CSV is 2GB. -{% endwarning %} - -{% anchor h3 %} -Create a New List from a CSV -{% endanchor %} - -To create a new list from your CSV choose “Add List or Segment” and then select “Upload CSV.” Add the name of the list you would like to create and then choose your file. - -{% anchor h3 %} -Add Contacts to a List -{% endanchor %} - -You can manually add a contact or upload a CSV of contacts directly to a list that already exists by going to your contacts page and clicking the gear icon in line with your list name and then selecting “Edit”. From the window that pops out, the normal upload or manual add functionality will be available. - -{% anchor h3 %} -Select Your Custom Fields -{% endanchor %} - -Once your file uploads, you will see a new window pop out that has inspected the header row from your CSV file. It will automatically show each column header from your header row. - -{% info %} -If you have a CSV that contains data you do not wish to upload, you may choose to skip certain column headers. All column headers other than "Email" may be skipped by selecting the "Skip Column" checkbox to the right of the column header. Skipped column headers will not be uploaded and will not appear as custom fields within an individual contact's profile. -{% endinfo %} - -For each header you can select which custom field to associate to the data in the column. If the header matches a custom field name, the two will automatically be connected. You can also add a custom field if you need to. - -You will see the progress as your file uploads to SendGrid. This simply shows that we have the information. If your list is quite large, we will start the process of storing and automatically segmenting your contacts if you have already set up segments on your account. For smaller lists, you will see your contacts in your new list quickly. - -![]({{root_url}}/images/contacts_2.png "Upload Contact Status") - -Once we have completed processing your new contacts, you will receive a summary notification email with: - -* Total processed contacts -* Number of new contacts -* Number of updated contacts -* Number of errors -* Error messages for each errored row - -If there are any errors, there will be a link to download a CSV containing the errored rows so that you can reformat and re-upload those contacts. If you’re watching in the UI, every time you refresh the page your contact # should change as we’re processing your contacts. - -{% info %} -The download link to your CSV of errored rows will be available for 24 hours. -{% endinfo %} - -![]({{root_url}}/images/contacts_3.png "Upload Contact Status Email") - -{% info %} -If you [create a segment]({{root_url}}/User_Guide/Marketing_Campaigns/lists.html#-Create-a-Segment) before you -upload a list, any contact that fits the segment criteria you've defined will be added to that segment. -{% endinfo %} - -{% anchor h3 %} -Viewing a Contact Profile -{% endanchor %} - -{% info %} -Searches are case-insensitive but must be done using a whole email address that includes an "@" and any TLD like ".com" or ".io" -{% endinfo %} - -To view a specific contact profile, find the contact in one of your lists or by searching your contact database. Then click the contact’s email address. You will then be able to view the email, reserved fields that SendGrid provides, and list associations for this contact. - -![]({{root_url}}/images/contact_profile_page_details.png) - -To view any custom fields you have assigned to this contact, or to view any lists that you have added this contact to, you may flip through the tabs beneath the Contact Details. You may either view all custom fields at once, or you can filter them by the following types: “Text”, “Date”, and “Number”. - -![]({{root_url}}/images/contact_profile_page_tabs.png) - -{% anchor h3 %} -Editing a Contact Profile -{% endanchor %} - -When you are viewing a contact, click any of the "Edit" buttons to edit the contact's information within that section. This includes the SendGrid provided reserved fields (except email), any custom fields you’ve added for this contact, and any lists the contact is associated with. - -![]({{root_url}}/images/editing_contact_custom_fields.png) - -To edit the associated lists for your contact, simply click on the Associated Lists tab, enter or select the list you would like to use, and click Add. - -![]({{root_url}}/images/editing_associated_lists.png) - -{% anchor h3 %} -Delete a Specific Contact -{% endanchor %} - -To remove one or more contacts from a list, find the contact and click the "Remove from list" option in the gear icon ![]({{root_url}}/images/terms_5.png "Contact Options") in -the same row. You will also see an option to delete the contact, which deletes them from your contact database. - -![]({{root_url}}/images/contacts_4.png "Delete a contact") - -{% anchor h3 %} -Delete All Contacts -{% endanchor %} - -If you would like to delete all of your contacts at once, navigate to your [Contacts page](https://sendgrid.com/marketing_campaigns/contacts) and click on the Action Cog next to All Contacts. Select Delete All Contacts. - -This will delete all of your Marketing Campaigns contacts, without deactivating your account. - -![]({{root_url}}/images/delete_all_contacts.png) - - -{% anchor h2 %} -Troubleshooting Contacts Upload -{% endanchor %} - -{% anchor h3 %} -My upload file is not accepted -{% endanchor %} - -**Character Encoding** - -If your contacts list has non-English characters, please make sure that your file is a CSV file with UTF-8 formatting. - -**Text that looks like a number** - -Make sure that you don't have text fields that look like numbers. This excludes whole numbers (1,2,3,4) or decimals/floats (3.1415). Text that look like numbers are those that contain punctuation characters like a dash, underscore, parenthesis, or multiple dots. - -Some examples: - -* US Zip Code: 80202-1713 -* Phone numbers: “(555) 555-5555” or “555.555.5555” -* Monetary Values with the currency indicator such as $3.50 or €5.73 - -**Data Formatting** - -Make sure that your dates are properly formatted in your CSV. If you created your CSV with Excel, you may need to force the date format before exporting to CSV. Years must be represented as 4-digit numbers. 1999 not 99. Day and month fields may be represented as single numbers. - -The date format must be one of the following: MM/DD/YYYY, MM/D/YYYY, M/D/YYYY, or M/DD/YYYY - -**Missing Header** - -Your CSV should always have a header row. The rules for this are: - -1. You must have an “email” column. -1. Capitalization doesn’t matter. -1. The other columns can be blank. - -{% anchor h3 %} -I have more than one of the same email in my database -{% endanchor %} - -With SendGrid's Marketing Campaigns feature, the unique identifier is the email address. So, if you upload the same email address multiple times, the custom field data associated with that email will be updated with each upload to the most recently uploaded/updated information. This feature helps prevent you from accidentally emailing the user after they have unsubscribed. - -What you may want to do is add logic to set a custom field, based on the reason why you have duplicate emails in your system (for example multiple product lines) and then segment your user to be in lists based on those custom fields. - -{% anchor h3 %} -Additional Resources -{% endanchor h3 %} - -- [Lists and Segmentation](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/lists.html) -- [Unsubscribe Groups](https://sendgrid.com/docs/User_Guide/Suppressions/advanced_suppression_manager.html) -- [Custom Fields](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/custom_fields.html) diff --git a/source/User_Guide/Marketing_Campaigns/create-and-manage-unsubscribe-groups.md b/source/User_Guide/Marketing_Campaigns/create-and-manage-unsubscribe-groups.md new file mode 100644 index 0000000000..42a3ecd43a --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/create-and-manage-unsubscribe-groups.md @@ -0,0 +1,110 @@ +--- +layout: page +weight: 90 +title: Create and Manage Unsubscribe Groups +seo: + title: Create and Manage Unsubscribe Groups + description: Suppression Manager helps you to define and manage unsubscribe groups to keep you out of the spam folder. + keywords: unsubscribe groups, suppressions, manage unsubscribe groups, delete unsubscribe groups +navigation: + show: true +--- + +* [Create an Unsubscribe Group](#-Create-an-Unsubscribe-Group) +* [Add recipients to an Unsubscribe Group](#-Add-recipients-to-an-Unsubscribe-Group) +* [Managing Unsubscribe Groups](#-Managing-Unsubscribe-Groups) + * [Exporting an Unsubscribe Group List](#-Exporting-an-Unsubscribe-Group-List) + * [Editing an Unsubscribe Group](#-Editing-an-Unsubscribe-Group) + * [Deleting an Unsubscribe Group](#-Deleting-an-Unsubscribe-Group) + +Adding Unsubscribe Groups to your emails makes it easy to honor your recipients' email preferences and protects your sender reputation by complying with anti-spam legislation. + +{% anchor h2 %} +Create an Unsubscribe Group +{% endanchor %} + +*To create an Unsubscribe Group:* + +1. Select **Marketing** and then click **Unsubscribe Groups**. +1. Click **Add Unsubscribe Groups**. +1. Add a *Group Name* and *Group Description*. + +{% info %} +Make sure your Group Names and Group Descriptions are customer-friendly. This is what your recipients will see. +{% endinfo %} + +1. Select the checkbox if you want the Unsubscribe Group to display on the unsubscribe preferences page. +1. click **Save Unsubscribe Group**. + +{% info %} +To view the unsubscribe preferences page, select the action menu next to an Unsubscribe Group and then click **Preview**. Toggle to the Unsubscribe Preferences tab to view all of the options listed. {% endinfo %} + +{% anchor h2 %} +Add recipients to an Unsubscribe Group +{% endanchor %} + +*To upload a CSV:* + +1. Find the group you want to add recipients to and click the action menu. + +![]({{root_url}}/img/unsub_action_menu.png "Unsubcribe Group action menu") + +2. Select **Upload a CSV**. +3. Drag the CSV you want to upload into the field, or click **select a CSV file to upload** and locate the file you want to upload from your files. +4. Click **Upload CSV**. + +*To manually add recipients to an Unsubscribe Group:* + +1. Find the group you want to add recipients to and click the action menu. +1. Select **Manually Add**. +1. Enter a recipient email address and then click **Save**. + +{% anchor h2 %} +Managing Unsubscribe Groups +{% endanchor %} + +From the UI, you can edit Unsubscribe Groups or download a list of recipients that have unsubscribed from your emails. For more information on managing unsubscribes, see the SendGrid [Suppressions Overview]({{root_url}}/User_Guide/Suppressions/index.html#-Managing-Unsubscribes) + +{% anchor h3 %} +Exporting an Unsubscribe Group List +{% endanchor %} + +*To export an Unsubscribe Group List:* + +1. Navigate to the Unsubscribe Group you want to export. +1. Click the action menu. +1. Select **Export**. A CSV file begins downloading. + +{% anchor h3 %} +Editing an Unsubscribe Group +{% endanchor %} + +*To edit an Unsubscribe Group:* + +1. Navigate to the Unsubuscribe Group you want to edit. +1. Click the action menu. +1. Select **Edit**. +From the Edit Group page, you can change the Group Name, Group Description, and display preferences. + +{% anchor h3 %} +Deleting an Unsubscribe Group +{% endanchor %} + +*To delete an Unsubscribe Group:* + +1. Navigate to the Unsubuscribe Group you want to delete. +1. Click the action menu. +1. Select **Edit**. The Edit Group page opens. +1. Click **Delete Group**. +1. Confirm that you want to delete the selected group and then click **Delete**. + +![]({{root_url}}/img/confirm_unsub_group_delete.png "Confirm Unsubscribe Group Delete") + +{% anchor h3 %} +Additional Resources +{% endanchor h3 %} + +- [Suppressions Overview]({{root_url}}/User_Guide/Suppressions/index.html) +- [Group Unsubscribes]({{root_url}}/User_Guide/Suppressions/group_unsubscribes.html) +- [Global Unsubscribes]({{root_url}}/User_Guide/Suppressions/global_unsubscribes.html) + diff --git a/source/User_Guide/Marketing_Campaigns/custom_fields.md b/source/User_Guide/Marketing_Campaigns/custom_fields.md index 43e89005fd..95b8baf0bf 100644 --- a/source/User_Guide/Marketing_Campaigns/custom_fields.md +++ b/source/User_Guide/Marketing_Campaigns/custom_fields.md @@ -1,53 +1,107 @@ --- layout: page weight: 55 -title: Custom Fields +title: Using Custom Fields navigation: show: true -seo: - title: Custom Fields +seo: + title: Using Custom Fields + keywords: Custom Fields, Personalization, customized email override: true description: Custom fields help you segment your lists dynamically based on your user information. --- +- [Creating Custom Fields](#-Creating-Custom-Fields) +- [Reserved Fields](#-Reserved-Fields) +- [Deleting a Custom Field](#-Deleting-a-Custom-Field) +- [Troubleshooting](#-Troubleshooting) + -Custom fields allow you to add extra information about your contacts to your contact database. With custom fields, you can create custom segments from your individual contacts or from your contact database that will dynamically update your content with the values for the individual contact receiving the email. Your custom fields are completely customizable to the use cases and user information that you need. +Custom fields allow you to add extra information about a contact to your contact database when you upload a CSV. With custom fields, you can create custom segments from your individual contacts or from your contact database that dynamically update your content with the values for the individual contact receiving the email. Your custom fields are completely customizable to the use cases and user information that you need. -To add custom fields, simply navigate to the [custom fields page]({{site.marketing_campaigns_url}}/custom_fields), where you can create and manage your custom fields. You’ll notice that we have preloaded your account with the custom fields: email, first_name, and last_name. These are reserved fields and cannot be removed. See our [full list of reserved fields]({{root_url}}/Classroom/Troubleshooting/Authentication/you_have_used_a_reserved_field_name_for_your_custom_field.html). +{% info %} +You can create up to 120 custom fields. +{% endinfo %} -![]({{root_url}}/images/custom_fields_3.png "See Your New Custom Field") +{% anchor h2 %} +Creating Custom Fields +{% endanchor %} -To create a new custom field, simply click the “create new field” button at the top of the page. You will then see the “add new custom field” form, where you can add in the data about your custom field. +*To add a custom field:* -![]({{root_url}}/images/custom_fields_2.png "Add New Custom Field") +1. Navigate to the [Custom Fields page]({{site.marketing_campaigns_url}}/custom_fields). +1. Click **Create New Field**. +1. Add a _Field Name_ and _Field Type_. +1. Click **Save**. -The field name should be created using only alphanumeric characters (A-Z and 0-9) and underscores “_”. The field type can -be date, text, or number fields. We ask for the field type so that we can help you make segments from your contact -database. You will be able to query your list in different ways, based on the data type: +You can also add custom fields when you [upload]({{root_url}}/User_Guide/Marketing_Campaigns/Managing_Contacts/adding_contacts.html#-Uploading-a-CSV) a CSV to the contacts database. -* **Date** - will allow you to select contacts before, after, or on a specific date. *Example: 1/1/2014* -* **Text** - will allow you to select contacts who match specific text. *Example: Pet field that says "Dog"* -* **Number** - will allow you to do things like “greater than,” “less than,” or “equals.” Both decimal and integer values are accepted. *Example: The age of your recipient: 27* +The field name should be created using only alphanumeric characters (A-Z and 0-9) and underscores “_”. The field type can be date, text, or number fields. The *field type* is important for creating [segments](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts_lists.html) from your contact +database. -{% info %} -You can create up to 20 custom fields for each data type: date, text, and number. -{% endinfo %} +You can query your list in different ways, based on the data type: + +* **Date** - allows you to select contacts before, after, or on a specific date. *Example: 1/1/2014* +* **Text** - allows you to select contacts who match the specific text. *Example: Pet field that says "Dog"* +* **Number** - allows you to do things like “greater than,” “less than,” or “equals.” Both decimal and integer values are accepted. *Example: The age of your recipient: 27* {% warning %} Text custom fields are limited to a size of 32,766 bytes. {% endwarning %} -![]({{root_url}}/images/custom_fields_1.png "Default Custom Fields") +{% anchor h3 %} +Reserved Fields +{% endanchor %} + +Your account comes preloaded with reserved fields that cannot be removed. The following field names are all reserved: + + + + + + + + + + + + + +
Field NameField Type
idtext
first_nametext
last_nametext
emailtext
liststext
created_atdate
updated_atdate
last_emaileddate
last_clickeddate
last_openeddate
+ + +Except for first_name, last_name, and email these fields are auto-populated by SendGrid and correspond to data for each contact in the app. Reserved fields are used to track useful metrics for your contacts by default. {% anchor h2 %} -Delete a Custom Field +Deleting a Custom Field {% endanchor %} +*To delete a custom field:* + +1. Navigate to **Marketing Campaigns** and select **Custom Fields**. +1. Locate the field you wish to remove. +1. Hover over the action menu to the right of the field name entry. +1. Select the delete icon. +1. Click **Confirm**. + {% warning %} -Deleting this custom field will delete all values for that field across your contact database. If you have any campaigns using this field's substitution tag, those will NOT get replaced when the campaign is sent. You will not be allowed to delete this custom field if it is currently being used in a segment. This deletion process may take several minutes--you will continue to see the custom field on this page until the process has completed. +Deleting a custom field deletes all values for that field across your contact database. If you have any campaigns using the data in this field with a substitution tag, those values do NOT get replaced when you send the campaign. You cannot delete a custom field that a segment is currently using. This deletion process may take several minutes--you continue to see the custom field on this page until the process has completed. {% endwarning %} -If you need to delete a custom field, you can do so by clicking the ![]({{root_url}}/images/terms_5.png "Default Custom Fields") in -the same row as your field. When you delete the custom field, you will see a warning that all data associated with this field will be removed as well. +{% anchor h2 %} +Troubleshooting +{% endanchor %} + + +If a Custom Field value does not appear in the corresponding [Substitution Tag]({{root_url}}/User_Guide/Marketing_Campaigns/editor.html#-Using-Substitution-Tags), make sure that there is a value for that custom field associated with the contact in your contact database. If there is no value for a particular custom field, a space will be substituted instead. + +If you do find that the custom field has an associated value on the contact’s profile page, check the spelling of the substitution tag in the content of your campaign. + +{% anchor h3 %} +Additional Resources +{% endanchor h3 %} +- [Substitution Tags](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/editor.html#-Using-Substitution-Tags) +- [Contacts](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/contacts.html) +- [Creating and exporting segments](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/Managing_Contacts/lists.html) diff --git a/source/User_Guide/Marketing_Campaigns/dashboard.html b/source/User_Guide/Marketing_Campaigns/dashboard.html deleted file mode 100644 index b695460ba0..0000000000 --- a/source/User_Guide/Marketing_Campaigns/dashboard.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - Redirecting... - - - - - -

Redirecting...

-

Click here if you are not redirected.

- - - diff --git a/source/User_Guide/Marketing_Campaigns/design_editor.md b/source/User_Guide/Marketing_Campaigns/design_editor.md deleted file mode 100644 index d841d857af..0000000000 --- a/source/User_Guide/Marketing_Campaigns/design_editor.md +++ /dev/null @@ -1,611 +0,0 @@ ---- -layout: page -weight: 80 -title: Design Editor -navigation: - show: true -seo: - title: Design Editor - override: true - description: ---- - - -The design editor is where you build your templates and campaigns using drag & drop WYSIWYG tools. You can use the design editor to make changes to the various modules like text, images, buttons, links, columns, or custom code that make up the content you include in your campaigns. - -* [Getting Started With the Design Editor](#-Getting-Started-With-the-Design-Editor) -* [Using Drag & Drop Modules](#-Using-Drag--Drop-Modules) - * [Drag & Drop Module Descriptions and Styles](#-Drag-Drop-Module-Descriptions-and-Styles) -* [Using Global Styles](#-Using-Global-Styles) -* [Editing Module HTML](#-Editing-Module-HTML) -* [Code Modules](#-Code-Modules) -* [Adding Images](#-Adding-Images) -* [Using Substitution Tags](#-Using-Substitution-Tags) -* [Previewing Your Campaign](#-Previewing-Your-Campaign) -* [Editing the HTML Head](#-Editing-the-HTML-Head) -* [Importing Custom HTML With Drag & Drop Markup](#-Importing-Custom-HTML-With-Drag--Drop-Markup) - * [Drag & Drop Markup](#-Drag--Drop-Markup) - * [Drag & Drop Code Examples](#-Drag--Drop-Code-Examples) -* [Exporting HTML From the Design Editor](#-Exporting-HTML-From-the-Design-Editor) - -{% anchor h3 %} -Getting Started With the Design Editor -{% endanchor h3 %} - -1. From the left-hand navigation, select **Marketing**, and then click **Campaigns**. -1. Click **Create Campaign**. - - To create a campaign using an existing campaign, find the campaign you want to use and click the action menu next to the campaign and then select Edit or Duplicate. - - ![]({{root_url}}/images/duplicate_campaign.png) - -1. Select the template that you want to use for your campaign. -
You can select a Blank Template, a custom template that you have already created, or one of SendGrid's pre-built templates. For more information, see [Working With Templates](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/templates.html). - -1. Select **Design Editor**, and then click **Continue**. -
The Design Editor opens. - -{% anchor h3 %} -Using Drag & Drop Modules -{% endanchor h3 %} - -Drag & drop editing helps you swiftly build your campaign using pre-built content modules. You can easily edit individual modules in the left-hand sidebar and reorder modules in your campaign body with a simple click and drag of your mouse. - -*To add a drag & drop module:* - -1. Navigate to the **Build** tab, and then click **Add Modules**. - - ![]({{root_url}}/images/design_editor_drag_drop.png) - -2. Find the module tile you want to add to your campaign and drag and drop it into your content area. -3. Edit the module settings and add your custom content to build your campaign. - - -{% anchor h3 %} -Drag & Drop Module Descriptions and Styles -{% endanchor h3 %} - - - - -You can add the following drag & drop modules to your campaign: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ModuleDescriptionUnique Style Options
ButtonA clickable button that links to a URL.button color, border color, font color, width, height, padding, border radius, font size, button text, button URL, alignment,container background, container padding
ColumnsThis module contains multiple drop zones for other non-column modules.container background, container padding, cell padding, columns
CodeThis is an "anything goes" module where you can enter your own custom HTML.Module styles are not available for code modules.
TextCan contain text, tables, and images.Background color, padding, line height
ImageCan contain a single image.Data attributes can be inserted directly in the <img> tag.Image background, image margin, link url, alt text, alignment, responsive, height, width
Image and TextThis is a columns module with two columns - each can contain either an image or some text.Image, image position, image background, image margin, text background, text margin
SpacerAllows you to insert spacing between other modules.To add spacing using this module, simply adjust the padding in the <td> tag. For example, the spacer module will add a spacing of 50 pixels.Background color, spacing (padding-bottom)
DividerA visual divider, or horizontal rule, that can be placed between modules.Background color, line color, height, padding
SocialIcons that allow for social media integration within your campaigns.The module offers five different social media icon options (Facebook, Twitter, Instagram, Google+, and Pinterest) all of which can be toggled on or off as well as fully customized to match individual branding and design standards. URL, size, border radius, and icon ( Facebook, Twitter, Instagram, Google+, and Pinterest).
- -{% anchor h3 %} -Using Global Styles -{% endanchor h3 %} - -In addition to editing the styles for individual modules within your campaign/template, you may also make changes to the global styling of your entire campaign/template. This includes attributes such as the background color, text color, or font family. - -The email body is the entire area that your campaign or template fills inside your recipient’s browser or email inbox. - -Under the Global Styles dropdown menu in the left hand sidebar, click **Email Body** or **Content Container** to view and edit the following styles: - - - - - - - - - - - - - - -
Global StyleStyle Options
Email Body

Background Color - This is the color for the background of your entire campaign/template.

-

Text Color - This is the color of all text in your campaign/template.

-

Link Color - This is the color of all links in your campaign/template.

-

Font Family - This is the font family to be used for all text in your campaign/template.

-

Font Size - This is the default font size to be used for all text in your campaign/template.

-
Content Container

Width - This is the width of the container for your entire campaign/template. Your modules will all be contained within these dimensions.

-

Background Color - This is the color of the area containing your modules.

-

Padding - This is the amount of space that you want between your modules and the boundaries of the content container.

- -{% anchor h3 %} -Editing Module HTML -{% endanchor h3 %} - -*To edit Module HTML:* - -1. Select the module in the design editor and click the **< >** icon. -
A window opens where you can edit the module HTML. -1. When you are finished editing the HTML, click **Update**. - -{% info %} -If you make any structural code changes, you need to convert the module to a code module. -{% endinfo %} - -{% anchor h3 %} -Code Modules -{% endanchor h3 %} - -The code module is a unique drag & drop module that allows you to insert any custom HTML in your campaign as a single module which can be relocated and edited. - -{% warning %} -The Design Editor does not modify or validate any HTML inserted via a code module. Please be careful when using custom HTML, and always preview your campaign before sending it. -{% endwarning %} - -{% anchor h3 %} -Adding Images -{% endanchor h3 %} - -*To upload an image:* - -1. Navigate to the **Build** tab, and then click **Add Modules**. -1. Select the Images module, and drag and drop it into your content area. -
This opens a window where you can upload images to your image library. -1. Drag and drop the image you want to use from your files or select **Choose images** to upload. - -*To insert an image:* - -1. Navigate to the **Build** tab, and then click **Add Modules**. -1. Drag and drop the **Images** module into your content area. -
A window opens where you can select images from the image library. -1. Select the image you want to add to your campaign. -
The Image Details tab opens. -1. Insert your image in the campaign by clicking **Save Image**. - -{% anchor h3 %} -Using Substitution Tags -{% endanchor h3 %} - -Substitution tags allow you to easily generate dynamic content for each recipient on your contact list. When you send to a list of recipients you can specify substitution tags specific to each recipient. - -*To add a substitution tag to your campaign:* - -1. Navigate to the **Tags** tab. -1. Locate the tag you want to add to your campaign and click the **copy** icon. -1. Paste the tag into the module. - -You can add the following substitution tags to your marketing campaign: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Substitution TagDescriptionType
[%email%]The email address of the recipientPersonalization
[%first_name%]The first name of the recipientPersonalization
[%last_name%]The last name of the recipientPersonalization
[Sender_Name]The name of the sender selected when sending your campaignSender Identity
[Sender_City]The city on record for the sender selected when sending your campaignSender Identity
[Sender_State]The state on record for the sender selected when sending your campaignSender Identity
[Sender_Zip]The zip code on record for the sender selected when sending your campaignSender Identity
[Unsubscribe]This tag will be replaced with a link allowing your recipient to be added to the unsubscribe group selected when sending your campaign.Unsubscribe
[Unsubscribe_Preferences]This tag will be replaced with a link allowing your recipients to opt into or out of the various email unsubscribe groups you offer.Unsubscribe
[Weblink]This tag will be replaced with a link allowing your recipients to view your campaign content directly within their web browser.Weblink
- -For contacts with no entry in a custom field, the substitution tag appears blank. To set a default value, use the following pattern: - -[%first_name | Valued Customer%] - -{% anchor h3 %} -Previewing Your Campaign -{% endanchor h3 %} - -To preview your campaign or template, click the **Preview** button in the upper-left corner. - -You can toggle between a mobile and desktop preview mode by clicking either the desktop or mobile phone icons above the content area. - -To view a plain-text version of your campaign or template, click the **T** icon. When in this preview mode, you can edit the plain text content of your campaign or template by clicking the **Edit Plain Text** button. - -When previewing a campaign, you will also see a preview of the From name, the Subject, and the preheader text that you have selected. - -{% anchor h3 %} -Editing the HTML Head -{% endanchor %} - -The HTML `` element is where you can define any metadata you would like to include with your campaign or template. For example, you can use the `` element to define any custom fonts or CSS styles you would like to use. - -*To edit the HTML head of your campaign or template:* - -1. Navigate to the **Build** tab in the left-hand toolbar and scroll to the **Advanced** menu. -1. Expand the option titled **Edit HTML Head**. -1. Click **Edit** to begin editing your HTML head. -
A window appears where you can insert your custom HTML. -1. Once you've finished making your changes, click the **Update** button. - -{% anchor h4 %} -Adding Custom Fonts Using the HTML Head -{% endanchor %} - -Most commonly, users add custom fonts by using the tag to reference a web font hosted somewhere on the internet. For example, [Google Fonts](https://fonts.google.com). - -{% warning %} -Make sure that you define a web-safe font to use as a fallback if one of your recipient’s clients does not support your custom font. -{% endwarning %} - -While some inbox providers do not support web fonts, the following popular clients do provide web font support: - -* Apple Mail -* Outlook.com app -* Outlook 2000 -* Default Android Mail app (not the Android Gmail app) -* iOS Mail - -This list may change, and we cannot guarantee 100% support from any of these clients. - -*To add a custom font using the HTML head:* - -1. Open the HTML Head by navigating to the **Build** tab in the design editor. -1. Scroll down to the **Advanced** drop-down menu and select **Edit HTML Head**. -1. Click **Edit** to begin making your changes. -1. Insert a `` tag containing an href attribute pointing to your web font. - -For example: -{% codeblock lang:html %} - -{% endcodeblock %} - -Next, you’ll have to add add a ` -{% endcodeblock %} - -{% anchor h3 %} -Importing Custom HTML With Drag & Drop Markup -{% endanchor h3 %} - -If you are writing your own custom HTML that you plan on importing into the design editor, refer to the [drag & drop code examples](#-Drag-&-Drop-Code-Examples) to ensure that any modules you create are compatible with our drag & drop functionality. If you do not specify a data type that matches one of our drag & drop modules your code will be imported as a text module. - -*To import custom HTML:* - -1. Navigate to the **Build** tab in the left-hand navigation. -1. Scroll down and select the **Advanced** drop-down menu. -1. Expand the option titled **Import/Export**. -1. Click **Import**. -
A window opens where you can paste in your own HTML. - - ![]({{root_url}}/images/import_custom_html.png) - -1. Paste or enter the HTML you want to use, and then click **Import**. - -{% warning %} -Any HTML that you import replaces all existing content in your campaign or template. If you want to import only a section of HTML, use a [code module](#-Code-Modules). -{% endwarning %} - -{% anchor h3 %} -Drag & Drop Markup -{% endanchor h3 %} - -SendGrid parses your custom HTML, looking for any [drag & drop compatible modules](#-Drag-&-Drop-Code-Examples). - - * First, we look for any HTML elements that contain the attribute `role="modules-container"`. - * Next, we look for all HTML elements with the attribute `role="module"` that are descendants of the "modules-container" element. - -The `role="modules-container"` attribute is required so that we know where your drag and drop modules are located. All of the SendGrid pre-built templates include the `role="modules-container"` by default. You are only required to include this attribute when creating a campaign or template from scratch that you want to be compatible with the design editor. - -{% warning %} -Any HTML outside an element with the "modules-container" attribute will be discarded. Only [supported styling options and attributes](#-Drag-&-Drop-Module-Descriptions-and-Styles) will be included. - -If you don't include the "modules-container" attribute in any of your custom HTML, then all of your HTML will be imported as a single text module. -{% endwarning %} - -If your HTML does contain drag & drop modules, then these modules will be imported into your campaign or template. This allows you to move and edit them as you normally would. - -However, if your custom HTML is not compatible with drag & drop then your imported HTML will be imported as a text module. - -Following is an example of how you should structure and organize your custom HTML, where [module content] represents the content of your modules. - -{% codeblock lang:html %} -
- - [ module content ] -
- - [ module content ] -
- - [ module content ] -
-
-{% endcodeblock %} - -{% anchor h3 %} -Drag & Drop Code Examples -{% endanchor h3 %} - - - - - - - - -
ModuleCustom Module Code Examples
Image{% codeblock lang:html %} - - - - -{% endcodeblock %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- [MODULE CONTENT] -
Image & Text{% codeblock lang:html %} - - - - -
- - - - - -
- - - - -
- - - - -
- [MODULE CONTENT] -
-
-
- - - - -
- - - - -
- [MODULE CONTENT] -
-
-
-
-{% endcodeblock %}
Text{% codeblock lang:html %} - - - - -
- [MODULE CONTENT] -
-{% endcodeblock %}
Code{% codeblock lang:html %} - - - - -
- [MODULE CONTENT] -
-{% endcodeblock %}
Columns{% codeblock lang:html %} - - - - -
- - - - - -
- [MODULE CONTENT] - - [ANOTHER MODULE CONTENT] -
-
-{% endcodeblock %}
Button{% codeblock lang:html %} - - - - -
- - - - -
- [MODULE CONTENT] -
-
-{% endcodeblock %}
Divider{% codeblock lang:html %} - - - - -
- - - - -
-
-{% endcodeblock %}
Spacer{% codeblock lang:html %} - - - - -
-
-{% endcodeblock %}
Social{% codeblock lang:html %} - - - - - - -
- - - - [MODULE CONTENT] - - -
-
- -{% endcodeblock %}
- -{% anchor h3 %} -Exporting HTML From the Design Editor -{% endanchor h3 %} - -*To export the HTML of a template from the design editor:* - -1. Navigate to the **Build** tab in the left-hand navigation. -1. Scroll down and select the **Advanced** drop-down menu. -1. Expand the option titled **Import/Export**. -
This starts the raw HTML download of the template, excluding images. - -SendGrid hosts the images included in the pre-built templates and any images you have uploaded to the image library, so when you export a template’s HTML from the design editor, the embedded URLs in each `` tag will remain valid. - -*To open exported HTML in the code editor:* - -1. From the left-hand navigation, select **Marketing** and then click **Campaigns**. -1. Click **New Campaign**, and then select **Blank Template**. -1. Select **Code Editor**. -1. Paste the raw SendGrid template HTML into the code editor. - -{% anchor h3 %} -Additional Resources -{% endanchor h3 %} - -- [A/B Testing](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/a_b_testing.html) -- [Campaign Statistics](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/campaign_stats.html) -- [Code Editor](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/code_editor.html) diff --git a/source/User_Guide/Marketing_Campaigns/editor.md b/source/User_Guide/Marketing_Campaigns/editor.md new file mode 100644 index 0000000000..fd8b8fab13 --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/editor.md @@ -0,0 +1,848 @@ +--- +layout: page +weight: 81 +title: Design & Code Editor +navigation: + show: true +seo: + title: Design & Code Editor + override: true + description: SendGrid Marketing Campaigns' editing gives you complete control over your emails. Use a flexible, drag-and-drop Design editor, or a robust HTML code editor. +--- + + + +Marketing Campaigns is all about supporting your unique workflow, so you can get your work done more efficiently. You have complete control over the way that you create and edit each new campaign, thanks to two distinct editing experiences. + +* **[Choosing The Right Editor](#-Choosing-The-Right-Editor)** +* **[The Code Editor](#-The-Code-Editor)** + * [Code Editor Features](#-Code-Editor-Features) + * [Getting Started with the Code Editor](#-Getting-Started-with-the-Code-Editor) + * [Uploading Images](#-Uploading-Images) + * [Using Substitution Tags](#-Using-Substitution-Tags) + * [Adding Categories](#-Adding-Categories) +* **[The Design Editor](#-The-Design-Editor)** + * [Getting Started With the Design Editor](#-Getting-Started-With-the-Design-Editor) + * [Using Drag & Drop Modules](#-Using-Drag--Drop-Modules) + * [Drag & Drop Module Descriptions and Styles](#-Drag--Drop-Module-Descriptions-and-Styles) + * [Using Global Styles](#-Using-Global-Styles) + * [Editing Module HTML](#-Editing-Module-HTML) + * [Code Modules](#-Code-Modules) + * [Adding Images](#-Adding-Images) + * [Using Substitution Tags](#-Using-Substitution-Tags) + * [Previewing Your Campaign](#-Previewing-Your-Campaign) + * [Editing the HTML Head](#-Editing-the-HTML-Head) + * [Importing Custom HTML With Drag & Drop Markup](#-Importing-Custom-HTML-With-Drag--Drop-Markup) + * [Drag & Drop Markup](#-Drag--Drop-Markup) + * [Drag & Drop Code Examples](#-Drag--Drop-Code-Examples) + * [Exporting HTML From the Design Editor](#-Exporting-HTML-From-the-Design-Editor) + * [Creating Categories](#-Creating-Categories) + + +{% anchor h2 %} +Choosing The Right Editor +{% endanchor %} + +The [**Code Editor**](#-The-Code-Editor) is perfect for users who are importing, creating or editing custom HTML. It offers a robust environment to upload images, backed by a feature-packed editor – complete with split-screen preview, error flagging, scroll-syncing, syntax highlighting and more. While other email editors may be notorious for adding excess code to your project, rest assured that our editor never modifies your carefully crafted HTML. + +The [**Design Editor**](#-The-Design-Editor), complete with HTML access to each content module, offers powerful “what you see is what you get” (WYSIWYG) editing. It features a diverse library of content blocks, allowing you to build beautiful emails quickly and intuitively. Once placed into your campaign, each module offers access to edit the HTML and a robust panel of settings – perfect for customizing content precisely to your needs. + +{% info %} +The [Design Editor](#-The-Design-Editor) features a number of convenient ways to edit the HTML content of your email –– including the ability to [edit the HTML of each drag-and-drop module](#-Editing-Module-HTML), [edit the HTML `head` of your message](#-Editing-the-HTML-Head), and even import complete code using our [Drag & Drop Markup](#-Importing-Custom-HTML-With-Drag--Drop-Markup). +{% endinfo %} + +{% anchor h2 %} +The Code Editor +{% endanchor %} + +SendGrid’s marketer-friendly code editor features a powerful, split screen editing experience – perfect for building campaigns with your own custom HTML. It offers a number of helpful features, often found in native editors. + +* [Code Editor Features](#-Code-Editor-Features) +* [Getting Started with the Code Editor](#-Getting-Started-with-the-Code-Editor) +* [Uploading Images](#-Uploading-Images) +* [Using Substitution Tags](#-Using-Substitution-Tags) +* [Adding Categories](#-Adding-Categories) + +{% anchor h3 %} +Code Editor Features +{% endanchor %} + +**Live Template Preview** - +See how your email looks in real-time, as you write and edit code. No more tabbing between windows, refreshing or re-rendering. Marketing Campaigns’ split-screen editing experience displays your code on the left, and a pixel-perfect preview on the right. + +**Code & Tag Completion** - +As you type, the editor automatically makes common suggestions. You can accept them by tapping tab or return –– or, simply continue typing to ignore. Additionally, as you open a tag of any kind, the code editor automatically places a closing tag. + +**Error Flagging** - +If the code editor finds something that seems odd or inconsistent with best practices, instead of interrupting your workflow, it places a small red “x” in the margin of the line so you can come back and check when it’s convenient for you. + +**Scroll Syncing** - +Easily pinpoint the HTML element you wish to edit. Click anywhere on the right-side preview of your email, and the code on the left automatically jumps to the corresponding line. + +**Syntax Highlighting** - +As you edit, parts of your code highlights in various colors according to the type of syntax. This added dimension provides clarity and efficiency as you search for, locate and edit code elements. + +{% anchor h3 %} +Getting Started With The Code Editor +{% endanchor %} + +1. From the left-hand navigation, select **Marketing**, and then click **Campaigns**. +2. Click **Create Campaign**. +
To create a campaign using an existing campaign, find the campaign you want to use and click the action menu next to the campaign. +3. Then, select **Edit** or **Duplicate**. +4. Select **Code Editor**, and then click **Continue**. + +{% info %} +You can only edit unsent campaigns. +{% endinfo %} + +You can select a Blank Template, a custom template that you have already created, or one of SendGrid's pre-built templates. For more information, see [Working With Templates]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html). + +{% info %} +When you open one of your existing campaigns or templates in the new editor, SendGrid creates a duplicate of the original campaign or template. You may always open the original campaign or template in the previous editor. +{% endinfo %} + +If you have already built the HTML that you want to use in another application, copy and paste that code directly into the content area of the code editor. You can also write the HTML for your campaign or template directly in the code editor. + +The split-screen view of the Code Editor allows you to see a real-time preview of your campaign. You can toggle between a preview of how your campaign or template appears on a recipient’s desktop and mobile phone by clicking either the desktop or mobile phone icons above the content area. You can also view a plain-text version of your campaign or template by clicking the **T** icon. When in this preview mode, you can edit the plain text content of your campaign or template by clicking the **Edit Plain Text** button. + +{% warning %} +Once you create a new campaign or template in the Code Editor, it cannot be edited using the Design Editor. +{% endwarning %} + +{% anchor h3 %} +Uploading Images +{% endanchor %} + +1. Select the **images** icon above the HTML code. A window opens where you can upload images to your library. +2. Select the image you want to add from your image library. +3. Select the **image details** tab and copy the URL in the **Image Source URL** tab by clicking **Copy URL**. +4. Paste this URL in an image source tag in your campaign or template's HTML. +Example: `` + +{% anchor h3 %} +Using Substitution Tags +{% endanchor %} + +Substitution tags allow you to easily generate dynamic content for each recipient on your contact list. When you send to a list of recipients, you can specify substitution tags specific to each recipient. + +**To add a substitution tag to your campaign:** + +1. Click the **Settings** tab on the left side of the editor. +2. Click the **Tags** tab at the top of the Settings window. +3. Locate the tag you want to add to your campaign and click it to automatically copy it to your clipboard. +4. Paste the tag into the campaign. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Substitution TagDescriptionType
{% raw %}[%email%]{% endraw %}The email address of the recipientPersonalization
{% raw %}[%first_name%]{% endraw %}The first name of the recipientPersonalization
{% raw %}[%last_name%]{% endraw %}The last name of the recipientPersonalization
{% raw %}[sender_name]{% endraw %}* The name of the sender selected when sending your campaignSender Identity
{% raw %}[sender_city]{% endraw %}* The city on record for the sender selected when sending your campaignSender Identity
{% raw %}[sender_state]{% endraw %}* The state on record for the sender selected when sending your campaignSender Identity
{% raw %}[sender_zip]{% endraw %}* The zip code on record for the sender selected when sending your campaignSender Identity
{% raw %}<%asm_group_unsubscribe_
raw_url%>{% endraw %}
*
This tag is replaced with a link allowing your recipients opt out of any emails you send using the chosen Unsubscribe Group.Unsubscribe
{% raw %}<%asm_preferences_
raw_url%>{% endraw %}
+ *
This tag is replaced with a link allowing your recipients to opt out of any email unsubscribe groups you offer.Unsubscribe
{% raw %}<%asm_global_unsubscribe
_raw_url%>{% endraw %}
+ *
This tag is replaced with a link allowing your recipients to opt out of all email communication.Unsubscribe
{% raw %}[Weblink]{% endraw %}This tag is replaced with a link allowing your recipients to view your campaign content directly within their web browser.Weblink
+* For your convenience, these substitution tags are included by default in the Unsubscribe Module found on the Build tab of the Design Editor. + +{% info %} +For contacts with no entry in a custom field, the substitution tag appears blank. To set a default value, use the following pattern: + +`[%first_name | Valued Customer%]` +{% endinfo %} + +{% anchor h3 %} +Adding Categories +{% endanchor %} + +Assigning categories to a campaign allows you to track emails based on your own categorization system. By assigning your campaign to a category, you can track statistics across multiple similar campaigns. Example categories may include: “Weekly Digest,” “Product Announcements.” + +1. Click the *Settings* panel located on the left-hand side of the window to expand it. +1. Navigate to the *Settings* tab, and click **Campaign Settings** to expand the menu. +1. Locate the *Categories* field under *Campaign Settings*. +1. Select the *Add Categories* field. Type in the tag that you'd like to add, and press enter. + +{% info %} +Currently, only 10 categories can be added to each campaign. +{% endinfo %} + +{% anchor h2 %} +The Design Editor +{% endanchor %} + + + +SendGrid’s flexible design editor allows you to build your templates and campaigns using intuitive, drag and drop tools. The “What you see is what you get” (WYSIWYG) editing experience features a library of modules for easily adding content to your campaign. + +* [Getting Started With the Design Editor](#-Getting-Started-With-the-Design-Editor) +* [Using Drag & Drop Modules](#-Using-Drag--Drop-Modules) +* [Drag & Drop Module Descriptions and Styles](#-Drag--Drop-Module-Descriptions-and-Styles) +* [Using Global Styles](#-Using-Global-Styles) +* [Editing Module HTML](#-Editing-Module-HTML) +* [Code Modules](#-Code-Modules) +* [Adding Images](#-Adding-Images) +* [Using Substitution Tags](#-Using-Substitution-Tags) +* [Previewing Your Campaign](#-Previewing-Your-Campaign) +* [Editing the HTML Head](#-Editing-the-HTML-Head) +* [Importing Custom HTML With Drag & Drop Markup](#-Importing-Custom-HTML-With-Drag--Drop-Markup) + * [Drag & Drop Markup](#-Drag--Drop-Markup) + * [Drag & Drop Code Examples](#-Drag--Drop-Code-Examples) +* [Exporting HTML From the Design Editor](#-Exporting-HTML-From-the-Design-Editor) +* [Creating Categories](#-Creating-Categories) + +{% anchor h3 %} +Getting Started With the Design Editor +{% endanchor %} + +1. From the left-hand navigation, select **Marketing**, and then click **Campaigns**. +1. Click **Create Campaign**. +
To create a campaign using an existing campaign, find the campaign you want to use and click the action menu next to the campaign. Then, select **Edit** or **Duplicate**. + +![]({{root_url}}/img/campaigns_dashboard_categories_search.png) + +3. Select the template that you want to use for your campaign. +
You can select a Blank Template, a custom template that you have already created, or one of SendGrid’s pre-built templates. For more information, see [Working With Templates](<% root_url %>/User_Guide/Marketing_Campaigns/templates.html). +4. Select **Design Editor**, and then click **Continue**. +
The Design Editor opens. + +{% anchor h3 %} +Using Drag & Drop Modules +{% endanchor %} + +Drag & drop editing helps you swiftly build your campaign, using pre-built content modules. You can easily edit individual modules in the left-hand sidebar and reorder modules in your campaign body with a simple click and drag of your mouse. + +*To add a drag & drop module:* + +1. Navigate to the **Build** tab, and then click **Add Modules**. + + ![](<% root_url %>/img/design_editor_drag_drop.png) + +2. Find the module tile you want to add to your campaign and drag and drop it into your content area. +3. Edit the module settings and add your custom content to build your campaign. + +{% anchor h3 %} +Drag & Drop Module Descriptions and Styles +{% endanchor h3 %} + + + + +You can add the following drag & drop modules to your campaign: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModuleDescriptionUnique Style Options
ButtonA clickable button that links to a URL.button color, border color, font color, width, height, padding, border radius, font size, button text, button URL, alignment,container background, container padding
ColumnsThis module contains multiple drop zones for other non-column modules.container background, container padding, cell padding, columns
CodeThis is an "anything goes" module where you can enter your own custom HTML.Module styles are not available for code modules.
TextCan contain text, tables, and images.Background color, padding, line height
ImageCan contain a single image. Data attributes can be inserted directly in the <img> tag.Image background, image margin, link url, alt text, alignment, responsive, height, width
Image and TextThis is a columns module with two columns - each can contain either an image or some text.Image, image position, image background, image margin, text background, text margin
SpacerAllows you to insert spacing between other modules.To add spacing using this module, simply adjust the padding in the <td> tag. For example, the spacer module adds a spacing of 50 pixels.Background color, spacing (padding-bottom)
DividerA visual divider, or horizontal rule, that can be placed between modules.Background color, line color, height, padding
SocialIcons that allow for social media integration within your campaigns.The module offers five different social media icon options (Facebook, Twitter, Instagram, Google+, and Pinterest) all of which can be toggled on or off as well as fully customized to match individual branding and design standards. URL, size, border radius, and icon ( Facebook, Twitter, Instagram, Google+, and Pinterest).
UnsubscribeThis module is pre-populated with your sender information and unsubscribe links which are required in order to be compliant with anti-spam laws.Background color, padding, line height, font, font size, link color, alignment, Address Line, Unsubscribe Settings.
+ +{% anchor h3 %} +Using Global Styles +{% endanchor h3 %} + +In addition to editing the styles for individual modules within your campaign/template, you may also make changes to the global styling of your entire campaign/template. This includes attributes such as the background color, text color, or font family. + +The email body is the entire area that your campaign or template fills inside your recipient’s browser or email inbox. + +Under the Global Styles dropdown menu in the left hand sidebar, click **Email Body** or **Content Container** to view and edit the following styles: + + + + + + + + + + + + + + +
Global StyleStyle Options
Email Body

Background Color - This is the color for the background of your entire campaign/template.

+

Text Color - This is the color of all text in your campaign/template.

+

Link Color - This is the color of all links in your campaign/template.

+

Font Family - This is the font family to be used for all text in your campaign/template.

+

Font Size - This is the default font size to be used for all text in your campaign/template.

+
Content Container

Width - This is the width of the container for your entire campaign/template. Your modules are all contained within these dimensions.

+

Background Color - This is the color of the area containing your modules.

+

Padding - This is the amount of space that you want between your modules and the boundaries of the content container.

+ +{% anchor h3 %} +Editing Module HTML +{% endanchor h3 %} + +*To edit Module HTML:* + +1. Select the module in the design editor and click the **< >** icon. +
A window opens where you can edit the module HTML. +1. When you are finished editing the HTML, click **Update**. + +{% info %} +If you make any structural code changes, you need to convert the module to a code module. +{% endinfo %} + +{% anchor h3 %} +Code Modules +{% endanchor h3 %} + +The code module is a unique drag & drop module that allows you to insert any custom HTML in your campaign as a single module which can be relocated and edited. + +{% warning %} +The Design Editor does not modify or validate any HTML inserted via a code module. Please be careful when using custom HTML, and always preview your campaign before sending it. +{% endwarning %} + +{% anchor h3 %} +Adding Images +{% endanchor h3 %} + +*To upload an image:* + +1. Navigate to the **Build** tab, and then click **Add Modules**. +1. Select the Images module, and drag and drop it into your content area. +
This opens a window where you can upload images to your image library. +1. Drag and drop the image you want to use from your files or select **Choose images** to upload. + +*To insert an image:* + +1. Navigate to the **Build** tab, and then click **Add Modules**. +1. Drag and drop the **Images** module into your content area. +
A window opens where you can select images from the image library. +1. Select the image you want to add to your campaign. +
The Image Details tab opens. +1. Insert your image in the campaign by clicking **Save Image**. + +{% anchor h3 %} +Using Substitution Tags +{% endanchor h3 %} + +Substitution tags allow you to use any custom field data you've added to Marketing Campaigns to dynamically generate unique content for each recipient of your campaign. A common example is to add a recipient's first name to the body (or even the subject line) of your campaign. + +*To add a substitution tag to your campaign:* + +1. Navigate to the **Tags** tab. +1. Locate the tag you want to add to your campaign and click the **copy** icon. +1. Paste the tag into the module. + +Any custom fields you've created appear in the **Tags** tab of the Marketing Campaigns editor. Email is available by default. + +You'll also see a number of System Fields that you can place in the body of your campaign to populate with your data. These include: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Substitution TagDescriptionType
{% raw %}<% email %>{% endraw %}The email address of the recipientPersonalization
{% raw %}<% first_name %>{% endraw %}The first name of the recipientPersonalization
{% raw %}<% last_name %>{% endraw %}The last name of the recipientPersonalization
{% raw %}<% sender_name %>{% endraw %}* The name of the sender selected when sending your campaignSender Identity
{% raw %}<% sender_city %>{% endraw %}* The city on record for the sender selected when sending your campaignSender Identity
{% raw %}<% sender_state %>{% endraw %}* The state on record for the sender selected when sending your campaignSender Identity
{% raw %}<% sender_zip %>{% endraw %}* The zip code on record for the sender selected when sending your campaignSender Identity
{% raw %}<% unsubscribe %>{% endraw %}* This tag is replaced with a link allowing your recipients opt out of any emails you send using the chosen Unsubscribe Group.Unsubscribe
{% raw %}<% unsubscribe_
preferences %>{% endraw %}
+ *
This tag is replaced with a link allowing your recipients to opt out of any email unsubscribe groups you offer.Unsubscribe
{% raw %}<% Weblink %>{% endraw %}This tag is replaced with a link allowing your recipients to view your campaign content directly within their web browser.Weblink
+* For your convenience, these substitution tags are included by default in the Unsubscribe Module found on the Build tab of the Design Editor. + +For contacts with no entry in a custom field, the substitution tag appears blank. To set a default value, use the following pattern: + +`[%first_name | Valued Customer%]` + +{% anchor h3 %} +Previewing Your Campaign +{% endanchor h3 %} + +To preview your campaign or template, click the **Preview** button in the upper-left corner. + +You can toggle between a mobile and desktop preview mode by clicking either the desktop or mobile phone icons above the content area. + +To view a plain-text version of your campaign or template, click the **T** icon. When in this preview mode, you can edit the plain text content of your campaign or template by clicking the **Edit Plain Text** button. + +When previewing a campaign, you also see a preview of the From name, the Subject, and the preheader text that you have selected. + +{% anchor h3 %} +Editing the HTML Head +{% endanchor %} + +The HTML `` element is where you can define any metadata you would like to include with your campaign or template. For example, you can use the `` element to define any custom fonts or CSS styles you would like to use. + +*To edit the HTML head of your campaign or template:* + +1. Navigate to the **Build** tab in the left-hand toolbar and scroll to the **Advanced** menu. +1. Expand the option titled **Edit HTML Head**. +1. Click **Edit** to begin editing your HTML head. +
A window appears where you can insert your custom HTML. +1. Once you've finished making your changes, click the **Update** button. + +{% anchor h4 %} +Adding Custom Fonts Using the HTML Head +{% endanchor %} + +Most commonly, users add custom fonts by using the tag to reference a web font hosted somewhere on the internet. For example, [Google Fonts](https://fonts.google.com). + +{% warning %} +Make sure that you define a web-safe font to use as a fallback if one of your recipient’s clients does not support your custom font. +{% endwarning %} + +While some inbox providers do not support web fonts, the following popular clients do provide web font support: + +* Apple Mail +* Outlook.com app +* Outlook 2000 +* Default Android Mail app (not the Android Gmail app) +* iOS Mail + +This list may change, and we cannot guarantee 100% support from any of these clients. + +*To add a custom font using the HTML head:* + +1. Open the HTML Head by navigating to the **Build** tab in the design editor. +1. Scroll down to the **Advanced** drop-down menu and select **Edit HTML Head**. +1. Click **Edit** to begin making your changes. +1. Insert a `` tag containing an href attribute pointing to your web font. + +For example: +{% codeblock lang:html %} + +{% endcodeblock %} + +Next, you’ll have to add add a ` +{% endcodeblock %} + +{% anchor h3 %} +Importing Custom HTML With Drag & Drop Markup +{% endanchor h3 %} + +If you are writing your own custom HTML that you plan on importing into the design editor, refer to the [drag & drop code examples](#-Drag--Drop-Code-Examples) to ensure that any modules you create are compatible with our drag & drop functionality. If you do not specify a data type that matches one of our drag & drop modules your code is imported as a text module. + +*To import custom HTML:* + +1. Navigate to the **Build** tab in the left-hand navigation. +2. Scroll down and select the **Advanced** drop-down menu. +3. Expand the option titled **Import/Export**. +4. Click **Import**. +
A window opens where you can paste in your own HTML. + + ![]({{root_url}}/img/import_custom_html.png "Import custom HTML") + +5. Paste or enter the HTML you want to use, and then click **Import**. + +{% warning %} +Any HTML that you import replaces all existing content in your campaign or template. If you want to import only a section of HTML, use a [code module](#-Code-Modules). +{% endwarning %} + +{% anchor h3 %} +Drag & Drop Markup +{% endanchor h3 %} + +SendGrid parses your custom HTML, looking for any [drag & drop compatible modules](#-Drag--Drop-Code-Examples). + + * First, we look for any HTML elements that contain the attribute `role="modules-container"`. + * Next, we look for all HTML elements with the attribute `role="module"` that are descendants of the "modules-container" element. + +The `role="modules-container"` attribute is required so that we know where your drag and drop modules are located. All of the SendGrid pre-built templates include the `role="modules-container"` by default. You are only required to include this attribute when creating a campaign or template from scratch that you want to be compatible with the design editor. + +{% warning %} +Any HTML outside an element with the "modules-container" attribute is discarded. Only [supported styling options and attributes](#-Drag-&-Drop-Module-Descriptions-and-Styles) are included. + +If you don't include the "modules-container" attribute in any of your custom HTML, then all of your HTML is imported as a single text module. +{% endwarning %} + +Following is an example of how you should structure and organize your custom HTML, where [module content] represents the content of your modules. + +{% codeblock lang:html %} +
+ + [ module content ] +
+ + [ module content ] +
+ + [ module content ] +
+
+{% endcodeblock %} + +{% anchor h3 %} +Drag & Drop Code Examples +{% endanchor h3 %} + + + + + + + + +
ModuleCustom Module Code Examples
Image{% codeblock lang:html %} + + + + +{% endcodeblock %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ [MODULE CONTENT] +
Image & Text{% codeblock lang:html %} + + + + +
+ + + + + +
+ + + + +
+ + + + +
+ [MODULE CONTENT] +
+
+
+ + + + +
+ + + + +
+ [MODULE CONTENT] +
+
+
+
+{% endcodeblock %}
Text{% codeblock lang:html %} + + + + +
+ [MODULE CONTENT] +
+{% endcodeblock %}
Code{% codeblock lang:html %} + + + + +
+ [MODULE CONTENT] +
+{% endcodeblock %}
Columns{% codeblock lang:html %} + + + + +
+ + + + + +
+ [MODULE CONTENT] + + [ANOTHER MODULE CONTENT] +
+
+{% endcodeblock %}
Button{% codeblock lang:html %} + + + + +
+ + + + +
+ [MODULE CONTENT] +
+
+{% endcodeblock %}
Divider{% codeblock lang:html %} + + + + +
+ + + + +
+
+{% endcodeblock %}
Spacer{% codeblock lang:html %} + + + + +
+
+{% endcodeblock %}
Social{% codeblock lang:html %} + + + + + + +
+ + + + [MODULE CONTENT] + + +
+
+ +{% endcodeblock %}
+ +{% anchor h3 %} +Exporting HTML From the Design Editor +{% endanchor h3 %} + +*To export template HTML from the design editor:* + +1. Navigate to the **Build** tab in the left-hand navigation. +1. Scroll down and select the **Advanced** drop-down menu. +1. Expand the option titled **Import/Export**. +
This starts the raw HTML download of the template, excluding images. + +SendGrid hosts the images included in the pre-built templates and any images you have uploaded to the image library, so when you export a template’s HTML from the design editor, the embedded URLs in each `` tag remains valid. + +*To open exported HTML in the code editor:* + +1. From the left-hand navigation, select **Marketing** and then click **Campaigns**. +1. Click **New Campaign**, and then select **Blank Template**. +1. Select **Code Editor**. +1. Paste the raw SendGrid template HTML into the code editor. + +{% anchor h3 %} +Creating Categories +{% endanchor h3 %} + +Assigning categories to a campaign allows you to track emails based on your own categorization system. By assigning your campaign to a category, you can track statistics across multiple similar campaigns. Example categories: “Weekly Digest,” “Product Announcements.” + +*To add a category:* + +1. Navigate to the *Settings* tab, and click **Campaign Settings** to expand the menu. +1. Find the *Categories* field. +1. Enter the name of a new category or select a previously used category from the drop-down menu. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +* [Sending an Email]({{root_url}}/User_Guide/Marketing_Campaigns/getting_started.html) +* [A/B Testing]({{root_url}}/User_Guide/Marketing_Campaigns/a_b_testing.html) +* [Campaign Statistics]({{root_url}}/User_Guide/Marketing_Campaigns/campaign_stats.html) +* [Marketing Templates]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html) + * [Creating a New Template]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Creating-a-New-Template) + * [Editing an Existing Template]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Editing-an-Existing-Template) + * [Duplicating a SendGrid Template]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Duplicating-a-SendGrid-Template) + * [Duplicating a Custom Template]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Duplicating-a-Custom-Template) + * [Creating a Template from a Campaign]({{root_url}}/User_Guide/Marketing_Campaigns/templates.html#-Creating-a-Template-from-a-Campaign) + diff --git a/source/User_Guide/Marketing_Campaigns/getting_started.md b/source/User_Guide/Marketing_Campaigns/getting_started.md index e939512072..549e730c0c 100644 --- a/source/User_Guide/Marketing_Campaigns/getting_started.md +++ b/source/User_Guide/Marketing_Campaigns/getting_started.md @@ -1,16 +1,19 @@ --- layout: page weight: 99 -title: Sending an Email +title: How to Send Email navigation: show: true seo: - title: Sending an Email + title: How to Send Email override: true description: Send your first email using the Marketing Campaigns tool. --- + +If you want to send email programatically, see the [API reference]({{root_url}}/API_Reference/api_v3.html), or the [SMTP Reference]({{root_url}}/API_Reference/SMTP_API/using_the_smtp_api.html). + Before sending your first campaign, you need to do the following: - [Create an Account](https://sendgrid.com/pricing/?mc=SendGrid%20Documentation) @@ -19,19 +22,22 @@ Before sending your first campaign, you need to do the following: - [Add an Unsubscribe Group](https://sendgrid.com/docs/User_Guide/Suppressions/advanced_suppression_manager.html) - [Segment Your Contact List](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/lists.html) (Optional) -*To send your first email:* +*To send your first campaign:* -1. From the left-hand navigation, select **Marketing**, and then click **Campaigns**. +1. From the left-hand navigation, select **Marketing**, and then click **Campaigns**. -1. Click **Create Campaign**.To create a campaign from an existing one, find the version you want to use and click the **action menu** next to the campaign and then select **Edit** or **Duplicate**. -![]({{root_url}}/images/duplicate_campaign.png) +1. Click **Create Campaign**. +
To create a campaign from an existing one, find the version you want to use and click the **action menu** to the far right of the campaign and then select **Edit** or **Duplicate**. +![]({{root_url}}/images/campaigns_dashboard_categories_search.png) -1. Select the template that you want to use for your campaign. You can select a **Blank Template**, a custom template that you have already created, or one of SendGrid's pre-built templates. For more information, see [Marketing Templates](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/templates.html). +1. Select the template that you want to use for your campaign. +
You can select a **Blank Template**, a custom template that you have already created, or one of SendGrid's pre-built templates. For more information, see [Marketing Templates](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/templates.html). -1. Select an editor. You can choose between the **Design Editor** and the **Code Editor**. +1. Select an editor. +
You can choose between the **Design Editor** and the **Code Editor**. ![]({{root_url}}/images/choose_editor.png) -The Code Editor provides users who are importing, editing, or crafting custom HTML a robust environment to upload images, write HTML, and configure their campaign without interference from the HTML generating WYSIWYG tools. +The Code Editor provides users who are importing, editing, or crafting custom HTML a robust environment to upload images, write HTML, and configure their campaign without interference from the HTML generating WYSIWYG tools. The Design Editor offers users powerful drag & drop WYSIWYG editing tools making it possible for anyone to build beautiful emails, regardless of HTML knowledge. For those familiar with HTML looking to leverage the design editor you can modify the HTML of individual content modules. @@ -41,29 +47,54 @@ Designing Your Campaign Depending on your editor selection, you use different methods to design your campaign. Both the Design Editor and the Code Editor have the same three tabs: **Settings**, **Tags**, and **A/B Testing**. -1. Edit your campaign by filling in the fields in the **Settings** Tab. +1. Edit your campaign by filling in the fields in the **Settings** Tab. -1. Add your custom content. For more information about customizing your campaign, see [Using the Design Editor]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html) or [Using the Code Editor]({{root_url}}/User_Guide/Marketing_Campaigns/code_editor.html). +1. Add your custom content. +
For more information about customizing your campaign, see [Using the Design Editor]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html) or [Using the Code Editor]({{root_url}}/User_Guide/Marketing_Campaigns/code_editor.html). 1. Once you’ve finished editing your campaign, you can see what it looks like by clicking **Preview**. -1. To send a test email, enter the email addresses you want to send your campaign to and then click **Send Test**. +1. To send a test email, enter the email addresses you want to send your campaign to and then click **Send Test**. -1. If you would like to test the effectiveness of your email subject or content, you can set up an A/B test. For more information on A/B testing, see [[A/B Testing](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/a_b_testing.html)]. +1. If you would like to test the effectiveness of your email subject or content, you can set up an A/B test. For more information, see [A/B Testing](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/a_b_testing.html). -1. If you would like to test the effectiveness of your email subject or content, you can set up an A/B test. For more information on A/B testing, see [A/B Testing](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/a_b_testing.html). - -1. Add a list or segment of recipients to recieve your campaign. +1. Add a list or segment of recipients to receive your campaign. 1. To send your campaign, click **Send Campaign**. {% info %} -To schedule your campaign to send at a later time or date, toggle the **Send Immediately** button to **Off**, and enter the date and time you want the campaign to be sent. +Message size limit: The total message size should not exceed 20MB. This includes the message itself, headers, and the combined size of any attachments. +{% endinfo %} + +{% anchor h3 %} +Scheduling Your Campaign +{% endanchor h3 %} + +*To schedule your campaign:* + +1. To send your campaign at a later time or date, toggle the **Send Immediately** button to **Off**. +1. Enter the date and time you want the campaign to be sent. +1. Click **Schedule Campaign**. + +{% info %} +If you have the flexibility, it's better to schedule mail for off-peak times. Most emails are scheduled and sent at the top of the hour or half hour. Scheduling email to avoid those times (for example, scheduling at 10:53) can result in lower deferral rates because it won't be going through our servers at the same times as everyone else's mail. {% endinfo %} +{% warning %} +Be sure your account is set to the correct time zone in order to ensure that your emails get sent at the time you intend. +{% endwarning %} + +*To change your time zone:* + +1. From the left-hand navigation select **Settings**. +1. Click **Account Details** or go to https://app.sendgrid.com/settings/account. +1. Scroll to the bottom of the page, find **TIME ZONE**, and ensure your desired timezone is correct. + {% anchor h3 %} Additional Resources {% endanchor h3 %} - [Campaign Statistics](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/campaign_stats.html) - [Billing](https://sendgrid.com/docs/Classroom/Basics/index.html#Billing) +- [Sending with the API]({{root_url}}/API_Reference/api_v3.html) +- [Sending with SMTP]({{root_url}}/API_Reference/SMTP_API/using_the_smtp_api.html) diff --git a/source/User_Guide/Marketing_Campaigns/index.html b/source/User_Guide/Marketing_Campaigns/index.html deleted file mode 100644 index 81be6f3e40..0000000000 --- a/source/User_Guide/Marketing_Campaigns/index.html +++ /dev/null @@ -1,59 +0,0 @@ ---- -layout: page -weight: 100 -title: Marketing Campaigns -navigation: - show: true -seo: - title: Marketing Campaigns - override: true - description: With SendGrid Marketing Campaigns, you will be able to load in contacts, create segments, create and send campaigns, view your stats, and so much more. ---- - - -

- With SendGrid Marketing Campaigns, you will be able to load in contacts, - create segments, create and send campaigns, view your stats, and so much more. -

- -

Get started creating and sending your campaign to modify content, choose which lists to send to, add a suppression -group, add categories for stats tracking, and then send right away, or schedule your email to send at another time.

- -

Sender Identities - -Add your sender identity in the sender management section. -This is the from name, from email address, reply-to email address, and physical address that are sent with your campaigns. -

- -

Custom Fields - Set up your custom fields so that you can upload -contact-specific data. This allows us to automatically generate substitution tags for your emails and unlocks the ability to segment your contacts as well. -

- -

Contacts - Create a list by giving us a name, or select a list to update, and then upload your CSV file. We’ll load in all the data, -automatically add contacts to pre-created segments, and merge updated custom field data to existing contacts. -

- -

Lists and Segments - View your lists, create new lists, and add new lists to your account. You can also create segments, which will automatically update when - you add new contacts to your contacts database. -

- -

Email Templates - Copy and paste your preferred email template HTML into our template builder and then save it. When you’re ready to create -a campaign, we’ll have your template ready to go with a thumbnail so you can identify and select it quickly and easily. -

- -

A/B Test Your Campaign - While creating your campaign, turn on A/B testing for multiple versions of your campaign and send the best performing version to your recipients.

- -

Design Editor - Use our Design editor to swiftly build out your campaign content with predefined modules. Edit individual modules easily in the style sidebar, and reorder modules with a simple drag of your mouse.

- -

Code Editor - Use our C editor to swiftly build out your campaign content in HTML.

- -

Marketing Campaigns Dashboard - Your dashboard will give you aggregate stats for your SendGrid Marketing Campaigns account.

- -

If you have more questions, please check out our Marketing Campaigns FAQ.

- -{% anchor h2 %} -Marketing Campaigns APIs -{% endanchor %} - -

Contact Database API - Create, manage, and segment your email lists via our Contacts API.

- -

Campaigns API - Build and send Marketing Campaigns via our Campaigns API.

diff --git a/source/User_Guide/Marketing_Campaigns/index.md b/source/User_Guide/Marketing_Campaigns/index.md new file mode 100644 index 0000000000..a6a43fa8ed --- /dev/null +++ b/source/User_Guide/Marketing_Campaigns/index.md @@ -0,0 +1,151 @@ +--- +layout: page +weight: 100 +title: Overview +navigation: + show: true +seo: + title: Marketing Campaigns Overview + override: true + description: SendGrid Marketing Campaigns overview and video tutorials. +--- + + With SendGrid Marketing Campaigns, you will be able to add contacts, + create segments, create and send campaigns, view your stats, and so much more. + + + + {% anchor h2 %} + Marketing Campaigns features and video tutorials + {% endanchor %} + + * [Getting started with Marketing Campaigns](#-Getting-started-with-Marketing-Campaigns) + * [Sender identities](#-Sender-identities) + * [Custom Fields](#-Custom-Fields) + * [Contacts](#-Contacts) + * [Lists and segments](#-Lists-and-segments) + * [Email templates](#-Email-templates) + * [A/B testing](#-AB-testing) + * [Designing your campaign](#-Designing-your-campaign) + * [Unsubscribe groups](#-Unsubscribe-groups) + * [Marketing Campaigns dashboard](#-Marketing-Campaigns-dasbhoard) + * [Marketing Campaigns FAQ](#-Marketing-Campaigns-FAQ) + * [Marketing Campaigns APIs](#-Marketing-Campaigns-APIs) + +{% anchor h3 %} +Getting started with Marketing Campaigns +{% endanchor %} + +

Get started creating and sending your campaign to modify content, choose which lists to send to, add a suppression +group, add categories for stats tracking, and then send right away, or schedule your email to send at another time.

+

+ +{% anchor h3 %} +Sender identities +{% endanchor %} + +

Sender Identities - +Add your sender identity in the sender management section. +The sender identity contains the from name, from email address, reply-to email address, and physical address associated with your Marketing Campaign. +

+

+ +{% anchor h3 %} +Custom Fields +{% endanchor %} + +

Custom Fields - Set up your custom fields so that you can upload contact-specific data, automatically generate substitution tags for your emails, and segment your contacts. +

+

+ +{% anchor h3 %} +Contacts +{% endanchor %} + +

Contacts - Create a list by giving us a name, or select a list to update, and then upload your CSV file. We’ll load in all the data, +automatically add contacts to pre-created segments, and merge updated custom field data to existing contacts. +

+ +

+ +{% anchor h3 %} +Lists and segments +{% endanchor %} + +

Lists and Segments - View your lists, create new lists, and add new lists to your account. You can also create segments, which will automatically update when + you add new contacts to your contacts database. +

+ +Learn how to manage multiple lists of contacts. +

+ +Learn how to segment your contacts. +

+ +{% anchor h3 %} +Email templates +{% endanchor %} + +

Email Templates - Copy and paste your preferred email template HTML into our template builder and then save it. When you’re ready to create +a campaign, we’ll have your template ready to go with a thumbnail so you can identify and select it quickly and easily. +

+ +{% anchor h3 %} +A/B testing +{% endanchor %} + +

A/B Test Your Campaign - While creating your campaign, turn on A/B testing for multiple versions of your campaign and send the best performing version to your recipients.

+

+ +{% anchor h3 %} +Designing your campaign +{% endanchor %} + +

Design Editor - Use our Design editor to swiftly build out your campaign content with predefined modules. Edit individual modules easily in the style sidebar, and reorder modules with a simple drag of your mouse.

+ +Learn how to add Button, Columns, and Code Modules using the Design Editor. + + +

+ +Learn how to add Image and Text Modules using the Design Editor. + +

+ +Learn how to add Spacer, Divider, and Social Modules using the Design Editor. + +

+ + +

Code Editor - Use our Code editor to swiftly build out your campaign content in HTML.

+ +{% anchor h3 %} +Unsubscribe groups +{% endanchor %} + +

Unsubscribe Groups - Create Unsubscribe Groups and learn how to let recipients manage their unsubcribe preferences.

+ +

+ +{% anchor h3 %} +Marketing Campaigns dashboard +{% endanchor %} + +

Marketing Campaigns Dashboard - Your dashboard will give you aggregate stats for your SendGrid Marketing Campaigns account.

+ +

+ +{% anchor h3 %} +Marketing Campaigns FAQ +{% endanchor %} + +

If you have more questions, please check out our Marketing Campaigns FAQ.

+ + +{% anchor h3 %} +Marketing Campaigns APIs +{% endanchor %} + +

Contact Database API - Create, manage, and segment your email lists via our Contacts API.

+ +

Campaigns API - Build and send Marketing Campaigns via our Campaigns API.

diff --git a/source/User_Guide/Marketing_Campaigns/lists.md b/source/User_Guide/Marketing_Campaigns/lists.md deleted file mode 100644 index 221da38ede..0000000000 --- a/source/User_Guide/Marketing_Campaigns/lists.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -layout: page -weight: 60 -title: Lists and Segmentation -navigation: - show: true -seo: - title: Lists and Segmentation - override: true - description: ---- - - - -{% anchor h2 %} -What are Lists and Segments? -{% endanchor %} - -Lists are simply static collections of Marketing Campaigns contacts. By default, any new contacts you add are stored under ALL CONTACTS. You may create new lists when adding contacts either manually, or when uploading a CSV (comma separated values) file. - -Segments are dynamic collections of Marketing Campaigns contacts grouped together, or segmented, based on criteria you define. This can include data you track about them, such as gender, location, or package type, or how they’ve engaged with your emails previously. You can create a segment that pulls from ALL CONTACTS or from a specific existing list. - -Segments are dynamically updated over time as you add customers who meet the criteria of your segment, or as the traits of your contacts change. For example, a segment with the criteria ”opened an email within 30 days” will evolve as contacts engage (or don’t engage) with your email. Segmentation can be especially useful to ensure that you are targeting the best recipients for your campaign. - -{% info %} -You must create at least one list or segment in order to send a campaign. -{% endinfo %} - -{% anchor h2 %} -Managing Your Lists -{% endanchor %} - - - -All of your list management features can be reached through the gear icon on the main contacts page. Just click the icon on the right side of your list title to see Export, View List, Edit List, and Delete options. - -![]({{root_url}}/images/lists_2.png "List Management Options") - -{% anchor h3 %} -Change the List Name -{% endanchor %} - -To change the name of a list, view the list and then click the pencil icon next to the name of the list at the top of the page. You will be able to edit the name and then hit your enter key to save the change. - -![]({{root_url}}/images/lists_1.png "Change your list name") - -{% anchor h3 %} -Edit a List -{% endanchor %} - -When you select the “Edit List” option, you will be shown the upload contacts options that will allow you to add contacts directly to this list. You will also be able to create a segment of this list directly from this window. - -{% anchor h3 %} -Delete a List -{% endanchor %} - -If you would like to delete a list, go to [Contacts]({{site.marketing_campaigns_url}}/contacts) where you will see a list of your contacts, then click the gear icon in the same row as your list name and select “Delete”. Once you have confirmed that you do in fact want to delete this list, only the association of a contact to this list will be deleted. Your contact’s information will continue to exist in your contact database. - -{% anchor h3 %} -Create a List -{% endanchor %} -You create lists when you upload contacts, please check out our information on [uploading contacts]({{root_url}}/User_Guide/Marketing_Campaigns/contacts.html#-Uploading-Contacts) for more information. - -{% info %} -You can create up to 100 lists. -{% endinfo %} - -{% anchor h3 %} -Add Contacts to a list -{% endanchor %} - -To add contacts to a list, click the gear icon next to the list name and select “Edit List”. A window will pop out where you can upload a new CSV or manually add a contact. - -{% anchor h3 %} -Remove Contacts From a List -{% endanchor %} - -Click on the name of your list to view all the contacts on the list. Check the box next to the contacts you would like to remove. You will notice that a button at the top right corner will keep track of how many contacts you have selected. Click the button with the selected count and choose the option “Remove from this list” to take these contacts off the list. - -{% info %} -Choosing “Delete” will permanently remove the contacts from your contact database. You cannot roll back this change through the UI without re-adding the contacts manually or via a CSV. -{% endinfo %} - -If you would like to remove these contacts from your contact database, you can do that by selecting “Delete”. - - -{% anchor h2 %} -Create a Segment -{% endanchor %} - - - -You can create a new segment with multiple conditions based on the information you have stored about your contacts. This -includes email, first_name, last_name, and all of the custom fields you have created prior to making this segment. - -{% info %} -You can create up to 400 segments. -{% endinfo %} - -To set up a segment, click the “add list or Segment” button from [Contacts]({{site.marketing_campaigns_url}}/contacts). - -![]({{root_url}}/images/lists_5.png "Delete a List") - -Then select the “New Segmentation” option. You can then start managing the parameters for your segment including the name and the conditions that allow a -contact into this segment. This is where the type you set for your custom fields matters because different operators (`IS`, -`IS NOT`, `IS BEFORE`, `IS AFTER`, `CONTAINS WORD`, etc.) will show up depending on the type of custom field you selected. For -example, a field that is a “number” will show greater than, less than, and equals as options where a “text” field will -show `IS` and `IS NOT` as options. As you add conditions you -will be able to select `AND` or `OR` as options, where `AND` indicates -both conditions are required and `OR` indicates either condition will work. - -{% info %} -You can add up to 15 different conditions per segment. -{% endinfo %} - -![]({{root_url}}/images/lists_3.png "Create a Segment") - -You can also segment your users by their engagement with your email campaigns. To do this, create a new list and choose -the `Engagement: Opens` or `Engagement: Clicks` option from -the bottom of the conditions fields list. Based on the criteria you set, you can then market to your users based on how -engaged they are with a specific campaign. This is especially useful for doing things like rewarding high engagement users. - -![]({{root_url}}/images/lists_engagement_segment_1.png "User Engagement Segment") - - -{% anchor h3 %} -Export a Segment -{% endanchor %} - -Export the contacts on a list by clicking the gear icon in the same row as your segment and then choosing the “export” -option. This will trigger SendGrid to send an email to the primary email address on the account that includes a link to -download the CSV of all the contacts in the list and their associated custom field values. -The CSV export email will look like: - -![]({{root_url}}/images/lists_4.png "Export a Segment List") - -{% info %} -The download link for your CSV export will be valid for 24 hours. -{% endinfo %} - diff --git a/source/User_Guide/Marketing_Campaigns/marketing_campaigns_video_tutorials.md b/source/User_Guide/Marketing_Campaigns/marketing_campaigns_video_tutorials.md deleted file mode 100644 index e47f105195..0000000000 --- a/source/User_Guide/Marketing_Campaigns/marketing_campaigns_video_tutorials.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -layout: page -weight: 99 -title: Marketing Campaigns Video Tutorials -navigation: - show: true -seo: - title: Marketing Campaigns Video Tutorials - override: true - description: Learn how to use Marketing Campaigns with this handy series of videos... - keywords: Marketing Campaigns, SendGrid Marketing, SendGrid Marketing Campaigns, marketing, campaigns, video, list, contact, template, segment, tag, merge, custom, field ---- -- [Getting Started with Marketing Campaigns](#-Getting-Started-With-Marketing-Campaigns) -- [Contacts Tutorials](#-Contacts-Tutorials) -- [Design Tutorials](#-Design-Tutorials) -- [Sending Tutorials](#-Sending-Tutorials) - -{% anchor h2 %} Getting Started with Marketing Campaigns {% endanchor %} - -{% anchor h3 %}Getting Started with Senders{% endanchor %} - -Learn how to add a Sender. - -

- - -{% anchor h3 %}Getting Started with Contacts{% endanchor %} - -Learn how to upload a contact list. - -

- - -{% anchor h3 %}Getting Started with Unsubscribe Groups{% endanchor %} - -Learn how to create an Unsubscribe Group. - -

- - -{% anchor h3 %}Getting Started with Designing a Campaign{% endanchor %} - -Learn how to design a Campaign. - -

- - -{% anchor h3 %}Getting Started with Sending a Campaign{% endanchor %} - -Learn how to send a Campaign. - -

- - -{% anchor h3 %}Getting Started with Campaign Stats{% endanchor %} - -Learn how to interpret Campaign stats. - -

- - -{% anchor h2 %} Contacts Tutorials {% endanchor %} - -{% anchor h3 %}Creating Custom Fields{% endanchor %} - -Learn how to create Custom Fields for your contacts. - -

- - -{% anchor h3 %}Managing Multiple Contact Lists{% endanchor %} - -Learn how to manage multiple lists of contacts. - -

- - -{% anchor h3 %}Segmenting your Contacts{% endanchor %} - -Learn how to segment your contacts. - -

- - -{% anchor h2 %} Design Tutorials {% endanchor %} - -{% anchor h3 %}Adding Button, Columns, and Code Modules{% endanchor %} - -Learn how to add Button, Columns, and Code Modules using the Design Editor. - -

- - -{% anchor h3 %}Adding Image and Text Modules{% endanchor %} - -Learn how to add Image and Text Modules using the Design Editor. - -

- - -{% anchor h3 %}Adding Spacer, Divider, and Social Modules{% endanchor %} - -Learn how to add Spacer, Divider, and Social Modules using the Design Editor. - -

- - -{% anchor h2 %} Sending Tutorials {% endanchor %} - -{% anchor h3 %}Using A/B Testing{% endanchor %} - -Learn how to use A/B Testing when sending a campaign. - -

- diff --git a/source/User_Guide/Marketing_Campaigns/notifications.md b/source/User_Guide/Marketing_Campaigns/notifications.md index 06caf2f717..8bdff6f29a 100644 --- a/source/User_Guide/Marketing_Campaigns/notifications.md +++ b/source/User_Guide/Marketing_Campaigns/notifications.md @@ -14,7 +14,23 @@ seo: Set Notifications {% endanchor %} -If you would like to have notifications sent to an email other than your parent account address, you can opt in to receive email notifications from SendGrid about your account's marketing campaigns activity. Email notifications about CSV upload summaries, sender verifications, A/B test winner notifications, and list/segment exports can be sent to up to 10 different email addresses. Simply click "Add New Email" and enter an email address in the modal window that pops up. +If you would like to have notifications sent to an email other than your parent account address, you can opt in to receive email notifications from SendGrid about your account's marketing campaigns activity. + +*To add an email address to notifications:* + +1. Click **Add New Email**. +1. Enter the name of the person or account you are setting up the notification for. +1. Enter the email address of the person or account you are setting up the notification for. +1. Click **Save**. + +{% info %} +Email notifications about CSV upload summaries, sender verifications, A/B test winner notifications, and list/segment exports can be sent to up to 10 different email addresses. +{% endinfo %} + +{% anchor h3 %} +Additional Resources +{% endanchor h3 %} + +- [Contacts](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/contacts.html) -![]({{root_url}}/images/marketing_campaigns_notifications.png "Add email for notifications") diff --git a/source/User_Guide/Marketing_Campaigns/overview.md b/source/User_Guide/Marketing_Campaigns/overview.md deleted file mode 100644 index 0b3f32ed88..0000000000 --- a/source/User_Guide/Marketing_Campaigns/overview.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: page -weight: 99 -title: Dashboard -navigation: - show: true -seo: - title: Marketing Campaigns Dashboard - override: true - description: SendGrid's Marketing Campaigns Dashboard gives you an at-a-glance overview of your Marketing Email Campaigns information. - keywords: Marketing Campaigns, SendGrid Marketing, SendGrid Marketing Campaigns ---- - -When you log into SendGrid Marketing Campaigns, you will be able to toggle between 7-day and 30-day aggregate statistics about your email campaigns. With the toggles at the bottom of the graph, you can see detailed statistics about requests, deliveries, opens, unique opens, clicks, unique clicks, bounces, spam reports, unique unsubscribes, unique bounces, unique spam reports, and invalid emails. - -![]({{root_url}}/images/stats_2.png "Campaign Statistics") - diff --git a/source/User_Guide/Marketing_Campaigns/senders.md b/source/User_Guide/Marketing_Campaigns/senders.md index 885da3f75c..05ee70c08d 100644 --- a/source/User_Guide/Marketing_Campaigns/senders.md +++ b/source/User_Guide/Marketing_Campaigns/senders.md @@ -9,11 +9,15 @@ seo: override: true description: --- +* [Before you Begin](#-Before-you-Begin) +* [Adding a Sender](#-Adding a Sender) +* [Adding Sender Information to a Campaign](#-Adding-Sender-Information-to-a-Campaign) +* [Additional Resources](#-Additional-Resources) {% anchor h2 %} -Before you begin +Before you Begin {% endanchor h2 %} Before you begin, go to your SendGrid [account settings]({{site.app_url}}/user/account) to verify that your timezone and account email address are correct. Verifying your account information ensures that when you upload contacts, you receive notifications and that we deliver scheduled emails at the correct time. @@ -22,63 +26,66 @@ Before you begin, go to your SendGrid [account settings]({{site.app_url}}/user/a Adding a Sender {% endanchor h2 %} -1. Click **Create New Sender** -1. Fill out the entire "Add Sender Identity" form. This form is so extensive so that you are CAN-SPAM compliant. The footer of your emails includes the information you provide here. +The footer of your emails automatically contains your sender information, because CAN-SPAM regulations require this information in every email you send. - * **From Name** - This is user-friendly name that is displayed to the user when they receive their email. - * **From Email Address** - This will display to the user as the email address who sent this email. - * **Reply-To Email Address** - If your user hits reply in their email, the reply will go to this address. - * **Company Address, City, State, Zip Code, Country** - The address of your business, for CAN-SPAM compliance. - * **Nickname** - This is the name of this sender identity, which can be useful for identifying this identity in your list of senders. It will not be visible to your recipients. -
- ![]({{root_url}}/images/sender_identity_1.png "Sender Identities") +*To add a sender:* -1. After you fill out the form, click **Save**. -1. Check the email account and click the link in the email to verify the Sender email. - * To resend your verification email, click the gear icon under Actions on the Sender Management page and select Resend Verification. - * If you have a [verified whitelabel domain]({{root_url}}/User_Guide/Settings/Whitelabel/index.html) and your sender email address matches that domain exactly, your sender identity will automatically verify. +1. Navigate to **Marketing Campaigns** and then click **Senders**. +1. In the top right corner of the Sender Management page, click **Create New Sender**. +1. Fill in all of the fields on the page and then click **Save**. + * **From Name** - This is a user-friendly name that is displayed to the user when they receive their email. + * **From Email Address** - This will display to the user as the email address who sent this email. + * **Reply To** - If your user hits reply in their email, the reply will go to this address. + * **Company Address, City, State, Zip Code, Country** - The address of your business, because CAN-SPAM regulations require this information in every email you send. + * **Nickname** - A label for your sender identity to help you identify it more quickly - it is not visible to your recipients. +

+1. Check the email account associated with your SendGrid account and click the link in the email to verify the Sender email. -{% info %} -Your verification link is only valid for 48 hours. After that time you will need to restart the verification process. -{% endinfo %} +{% info %} You may create up to 100 unique senders.{% endinfo %} {% warning %} You must verify your sender identity before you can edit it or use it to send a campaign. {% endwarning %} + To resend your verification email, hover over the Action Menu on the Sender Management page and select **Resend Verification**. +{% info %} +If you have an [authenticated domain]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) and your sender email address matches that domain exactly, your sender identity will automatically verify. +{% endinfo %} {% warning %} -Once you schedule a campaign, you won't be able to delete the sender identity used. +Once you schedule a campaign, you cannot delete the sender identity associated with that campaign. {% endwarning %} {% anchor h2 %} -Using Your Preset Sender Information In Your Campaigns +Adding Sender Information to a Campaign {% endanchor %} You can insert your sender identity information into your campaigns using the following tags within your campaign or template content: -**[Sender_Name]** - The sender's name. +1. **[Sender_Name]** - The sender's name. + +1. **[Sender_Address]** - The sender's street address. -**[Sender_Address]** - The sender's street address. +1. **[Sender_City]** - The sender's city. -**[Sender_City]** - The sender's city. +1. **[Sender_State]** - The sender's state. -**[Sender_State]** - The sender's state. +1. **[Sender_Zip]** - The sender's zip. -**[Sender_Zip]** - The sender's zip. +1. **[Sender_Country]** - The sender's country. -**[Sender_Country]** - The sender's country. +*To add tags to your campaign:* -To show your sender's full address and information in the footer of the email, add the tags as shown: +1. Navigate to the **Build** tab. +1. Click and drag a Text module into your campaign body. +1. Navigate to the **Tags** tab. +1. Select the copy icon next to the tag you want to add to your campaign. +1. Click in the text module you added previously and paste the tag into the module. +To show your sender's full address and information in the footer of the email, SendGrid recommends adding the tags as shown: {% codeblock %} [Sender_Name] [Sender_Address] [Sender_City], [Sender_State] [Sender_Zip] {% endcodeblock %} -{% anchor h3 %} -Additional Resources -{% endanchor h3 %} - -- [Whitelabel](https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/index.html) diff --git a/source/User_Guide/Marketing_Campaigns/templates.md b/source/User_Guide/Marketing_Campaigns/templates.md index af53360719..73c26b023a 100644 --- a/source/User_Guide/Marketing_Campaigns/templates.md +++ b/source/User_Guide/Marketing_Campaigns/templates.md @@ -16,14 +16,21 @@ Marketing Campaigns templates determine how the content of your campaign will be We provide a collection of pre-built, responsive templates that you may begin using and customizing immediately, or you can create your own template from scratch. +- [Creating a New Template](#-Creating-a-New-Template) +- [Editing an Existing Template](#-Editing-an-Existing-Template) +- [Duplicating a SendGrid Template](#-Duplicating-a-SendGrid-Template) +- [Duplicating a Custom Template](#-Duplicating-a-Custom-Template) +- [Creating a Template from a Campaign](#-Creating-a-Template-from-a-Campaign) +- [Additional Resources](#-Additional-Resources) + {% anchor h3 %} Creating a New Template {% endanchor h3 %} *To create a new template:* -1. From the left-hand navigation, select **Campaigns**, and then select **Templates**. -2. Click **Create New Template**. +1. From the left-hand navigation, select **Campaigns**, and then select **Templates**. +2. Click **Create New Template**. 3. Select the editor you want to use, and then click **Continue**. {% info %} @@ -45,7 +52,7 @@ You can only edit custom templates (templates that you have created yourself or 1. Navigate to the template you want to edit.   1. Click the **action menu** and select **Edit**. - This navigates you to the editor originally used to create the campaign. After you create a template, you cannot switch between the design and code editor. + This navigates you to the editor originally used to create the campaign. After you create a template, you cannot switch between the design and code editor. However, if you choose the design editor you'll still have HTML editing options, and with the code editor you'll enjoy convenient visual tools like side-by-side code and preview panes. {% anchor h3 %} Duplicating a SendGrid Template @@ -56,8 +63,8 @@ You can easily duplicate a pre-built template provided by SendGrid. *To duplicate a SendGrid template:* 1. From the left-hand navigation, select **Campaigns** -1. Click **Templates**. -1. Locate the template you want to duplicate and then click the action cog. +1. Click **Templates**. +1. Locate the template you want to duplicate and then click the action menu. 1. Select **Duplicate**. The duplicate opens in the design editor. {% anchor h3 %} diff --git a/source/User_Guide/SendGrid_for_Mobile/dashboard.md b/source/User_Guide/SendGrid_for_Mobile/dashboard.md index cce135bd82..fc22a4495e 100644 --- a/source/User_Guide/SendGrid_for_Mobile/dashboard.md +++ b/source/User_Guide/SendGrid_for_Mobile/dashboard.md @@ -30,6 +30,12 @@ The dashboard page will display your account’s statistics for the past day, we You can also export the statistics for each individual day to a CSV file by tapping the “share” button. +

Additional Resources

+ +- [Deliverability Help]({{site.site_url}}/docs/Classroom/Deliver/index.html) +- [Send Index Help]({{site.site_url}}/docs/Classroom/Send/index.html) +- [Track Index Help]({{site.site_url}}/docs/Classroom/Track/index.html) +

1Apple and the Apple logo are trademarks of Apple Inc., registered in the U.S. and other countries. App Store is a service mark of Apple Inc.

diff --git a/source/User_Guide/SendGrid_for_Mobile/email_activity.md b/source/User_Guide/SendGrid_for_Mobile/email_activity.md index 151526e2f4..468be9cea7 100644 --- a/source/User_Guide/SendGrid_for_Mobile/email_activity.md +++ b/source/User_Guide/SendGrid_for_Mobile/email_activity.md @@ -1,7 +1,7 @@ --- seo: title: SendGrid for iPhone and iPad Email Activity -title: Email Activity +title: Email Activity for Mobile weight: 700 layout: page navigation: @@ -26,12 +26,18 @@ navigation: 2

-Here you can view the real-time logs of all [email activity]({{root_url}}/User_Guide/email_activity.html) from your account in the last 7 days. You can also narrow your search by pulling down on the screen and searching for an email address, and/or selecting the “More” button in the top right corner, selecting “Search Options,” and selecting only certain events to show. +Here you can view the real-time logs of all [email activity]({{root_url}}/User_Guide/email_activity.html) from your account. You can also narrow your search by pulling down on the screen and searching for an email address, and/or selecting the “More” button in the top right corner, selecting “Search Options,” and selecting only certain events to show. Tapping on any event will reveal more information, such as server responses or user agents. Finally, you can export your email activity by selecting the “More” button in the top right corner and selecting “Export.” This will create a CSV that you can open in another app on your device. +

Additional Resources

+ +- [Email Activity]({{root_url}}/User_Guide/email_activity.html) +- [Email Service Provider]({{site.site_url}}/docs/Glossary/email_service_provider.html) +- [Bulk Email Service]({{site.site_url}}/docs/Glossary/bulk_email_service.html) +

1Apple and the Apple logo are trademarks of Apple Inc., registered in the U.S. and other countries. App Store is a service mark of Apple Inc.

diff --git a/source/User_Guide/SendGrid_for_Mobile/index.html b/source/User_Guide/SendGrid_for_Mobile/index.html index 6a75516bec..487a3c1ff0 100644 --- a/source/User_Guide/SendGrid_for_Mobile/index.html +++ b/source/User_Guide/SendGrid_for_Mobile/index.html @@ -21,7 +21,7 @@

    -
  • View and search real-time delivery metrics (clicks, opens, bounces, etc.)
  • +
  • View and search real-time statistics (clicks, opens, bounces, etc.)
  • Manage unsubscribe/suppression lists
  • Search and troubleshoot by email address
  • Drill down to view subuser accounts
  • @@ -52,6 +52,14 @@ 2

    +{% anchor h2 %} +Additional Resources +{% endanchor %} + + +

    1Apple and the Apple logo are trademarks of Apple Inc., registered in the U.S. and other countries. App Store is a service mark of Apple Inc.

    diff --git a/source/User_Guide/SendGrid_for_Mobile/subusers.md b/source/User_Guide/SendGrid_for_Mobile/subusers.md index 1a9d19fdbc..a600fc2d33 100644 --- a/source/User_Guide/SendGrid_for_Mobile/subusers.md +++ b/source/User_Guide/SendGrid_for_Mobile/subusers.md @@ -38,6 +38,12 @@ The app currently only displays a maximum of 10 subusers. If you have more than Once you select a subuser, you’ll be presented with a summary of the account’s performance. You can then click the “Impersonate User” button to log in as that subuser and view their apps. When impersonating a subuser, you’ll find a message in the banner at the top of the page that says “You’re currently logged in as [subuser name].” You can switch back to your parent account by clicking the “Back to Parent Account” link on the left side of the banner at the top of the SendGrid UI. +

    Additional Resources

    + +- [Subuser Management Documentation]({{site.site_url}}/docs/API_Reference/Web_API/Customer_Subuser_API/subusers.html) +- [Authenticate a Subuser]({{site.site_url}}/docs/API_Reference/Web_API/Customer_Subuser_API/authenticate_a_subuser.html) +- [Subuser Bounces]({{site.site_url}}/docs/API_Reference/Web_API/Customer_Subuser_API/subuser_bounces.html) +

    1Apple and the Apple logo are trademarks of Apple Inc., registered in the U.S. and other countries. App Store is a service mark of Apple Inc.

    diff --git a/source/User_Guide/SendGrid_for_Mobile/suppression.md b/source/User_Guide/SendGrid_for_Mobile/suppression.md index 371f4762b0..0c0784b7f8 100644 --- a/source/User_Guide/SendGrid_for_Mobile/suppression.md +++ b/source/User_Guide/SendGrid_for_Mobile/suppression.md @@ -34,6 +34,12 @@ If you’re viewing the unsubscribe list, you can hit the “+” button to manu Finally, if you want to search for a specific address, pull downwards on the list and type an address in the search field. +

    Additional Resources

    + +- [Suppression Documentation]({{site.site_url}}/docs/User_Guide/Suppressions/index.html) +- [Suppression Blocks]({{site.site_url}}/docs/User_Guide/Suppressions/blocks.html) +- [Suppression Bounces]({{site.site_url}}/docs/User_Guide/Suppressions/bounces.html) +

    1Apple and the Apple logo are trademarks of Apple Inc., registered in the U.S. and other countries. App Store is a service mark of Apple Inc.

    diff --git a/source/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.md b/source/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.md new file mode 100644 index 0000000000..8bae90187e --- /dev/null +++ b/source/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.md @@ -0,0 +1,173 @@ +--- +layout: page +weight: 0 +title: How to set up domain authentication +navigation: + show: true +seo: + title: How to set up domain authentication + override: true + description: Set up sender authentication to improve your deliverability and security of your emails. +--- + + + +- [What is domain authentication?](#-What-is-domain-authentication) +- [Key terminology](#-Key terminology) + - [DNS](#-DNS) + - [DKIM](#-DKIM) + - [SPF](#-SPF) + - [CNAME](#-CNAME) +- [Setting up domain authentication](#-Setting-up-domain-authentication) + - [Before you begin](#-Before-you-begin) + - [Setting up DNS](#-Setting-up-DNS) +- [Advanced settings](#-Advanced-settings) + - [Using automated security](#-Using-automated-security) + - [Using a custom return path](#-Using-a-custom-return-path) + - [Using a custom DKIM selector](#-Using-a-custom-DKIM-selector) + - [Assigning a subuser](#-Assigning-a-subuser) +- [Migrating from legacy Whitelabel](#-Migrating-from-legacy-Whitelabel) + +{% anchor h2 %} +What is domain authentication? +{% endanchor %} + +Domain authentication shows email providers that SendGrid has your permission to send emails on your behalf. To give SendGrid permission, you point DNS entries from your DNS provider (like GoDaddy, Rackspace, or Cloudflare) to SendGrid. Your recipients will no longer see the “via sendgrid.net” message on your emails. + +Even though this is a small change from your recipients perspective, this change has a huge positive impact on your reputation as a sender and your email deliverability. Email service providers distrust messages that don't have domain authentication set up because they can not be sure that the message comes from you. Explicitly stating that it comes from you increases your reputation with email service providers which makes it much less likely that they will filter your mail and not allow it get to your recipient's inbox, which increases your deliverability. You are also explicitly showing your recipients that this email comes from you, so they are less likely to mark your mail as spam. + +{% anchor h2 %} +Key terminology +{% endanchor %} + +{% anchor h3 %} +DNS +{% endanchor %} + +DNS stands for Domain Name System. This is a naming system for domains on the internet. When SendGrid refers to your DNS, we are talking about your domain name that you want to send emails from, or that you want to link images from. When we talk about your DNS provider, we are talking about the service that hosts your domain name. For example, GoDaddy, Rackspace, or Cloudflare. For more information about DNS, see our [DNS glossary page]({{root_url}}/Glossary/dns.html). + +{% anchor h3 %} +DKIM +{% endanchor %} + +DKIM stands for DomainKeys Identified Mail which was designed to help email providers prevent malicious email senders by validating email from specific domains. + +As one of the most popular email authentication methodologies, it works by using cryptographic technology that adds a digital signature to your message header. This DKIM signature validates and authorizes your domain name in the eyes of the receiver. The DKIM signature is created using a unique string of characters stored as a public key. + +When your email is received, the public key is retrieved through the DNS and decrypted by the receiver to allow them to confidently verify the identity of your domain. For more information about DKIM, see our [DKIM glossary page]({{root_url}}/Glossary/dkim.html). + +{% anchor h3 %} +SPF +{% endanchor %} + +Sender Policy Framework (SPF) is an email authentication standard developed by AOL that compares the email sender’s actual IP address to a list of IP addresses authorized to send mail from that domain. The IP list is published in the domain’s DNS record. For more information about SPF, check out our [SPF glossary page]({{root_url}}/Glossary/spf.html). + +{% anchor h3 %} +CNAME +{% endanchor %} + +The CNAME record creates an alias for subdomain.yourdomain.com and points to sendgrid.net. The CNAME is needed for our click and open tracking features in order for those statistics to be routed back to your SendGrid account. This will also be what your messages are signed by, so your recipients will be able see what you have chosen for your CNAME. You set up the CNAME files that SendGrid provides with your DNS host. For more information about CNAME, see our [CNAME glossary page]({{root_url}}/Glossary/cname.html). + +{% anchor h2 %} +Setting up domain authentication +{% endanchor %} + +{% anchor h3 %} +Before you begin +{% endanchor %} + +To set up domain authentication, you must submit the DNS records provided by SendGrid to your DNS or hosting provider (for example, GoDaddy, Hover, CloudFlare, etc.). First, figure out who your hosting provider is and if you have access. If you don't have access to your DNS or hosting provider, you should figure out who in your company has this access before you begin setting up domain authentication. + +*To set up domain authentication:* + +1. In the SendGrid UI, select [Settings > Sender Authentication](https://app.sendgrid.com/settings/sender_auth). +1. In the domain authentication section, click **Get Started**. +1. Next, add in information about your DNS host, and indicate whether you also want to set up link branding. Click **Next**. For more information about link branding, check out [What is link branding?]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html#-What-is-link-branding). +1. Fill in the domain that you want to send from and add advanced settings as needed. Make sure that you only enter the name of your root domain. Do not include `www` or `http://www` in this field! Your domain needs to match the domain of your FROM address on the emails you are sending out. For example, if I am sending an email from `example@sendgrid.com`, I would set my domain authentication domain to be `sendgrid.com`. Click **Next**. For more information about advanced settings, see [Advanced settings](#-Advanced-settings). +1. Next, you need to add all of the CNAME records on this screen to your DNS host. This process varies depending on your DNS host. For videos on how to add your CNAME to some popular DNS service providers, check out these [videos](https://sendgrid.com/docs/User_Guide/Settings/Sender_authentication/providers.html). If you don't have access to modify your companies DNS records, you can also email a request to a co-worker. This email includes a direct link to the CNAME records. This link does expire. The recipient doesn't need login access to your SendGrid account. + +{% info %} +If you [turn off automated security](#-Using-automated-security), you add TXT and MX records in this step instead of CNAME records. +{% endinfo %} + +It can take up to 48 hours for the records to verify after you upload them into your DNS host, so you will likely have to come back later to verify. + +{% anchor h3 %} +Verifying your DNS +{% endanchor %} + +Once you add the CNAME records to your DNS host, return to the [Sender authentication page](https://app.sendgrid.com/settings/sender_auth) and click **Verify**. + +{% info %} +If you click verify, and only half of your CNAME records verify, this usually means that you need to wait a bit longer. It's also possible that you entered one of your records in incorrectly. For other troubleshooting information, see [Sender authentication troubleshooting]({{root_url}}/User_Guide/Settings/Sender_authentication/Troubleshooting.html). +{% endinfo %} + +Any time that you send an email with a FROM address whose domain matches the domain set in the domain authentication, SendGrid applies that domain to your email. You only need to update your domain authentication if you want to update the domain you are emailing from. + +{% anchor h2 %} +Advanced settings +{% endanchor %} + + + +{% anchor h3 %} +Using automated security +{% endanchor %} + + Automated security allows SendGrid to handle the signing of your DKIM and authentication of your SPF for your outbound email with CNAME records. This allows you to add a dedicated IP address or update your account without having to update your SPF record. + +Automated security defaults to **On**. If your DNS provider does not accept underscores in CNAME records, you will have to turn off Automated Security to use MX and TXT records. + +When Automated Security is **On**, SendGrid generates three different CNAME records. In a later step of setting up domain authentication, you give these records to your DNS provider, and then you verify that they upload correctly. + +If you select **Off**, we generate 1 MX record and 2 TXT records. In a later step of setting up domain authentication, you give these records to your DNS provider, and then you verify that they upload correctly. + +{% info %} +If you turn off automated security, you are responsible for managing and updating the MX and TXT records yourself. +{% endinfo %} + +{% anchor h3 %} +Using a custom return path +{% endanchor %} + +Use a custom return path to customize your subdomain. + +*To use a custom return path:* + +When you are in the process of authenticating a domain, and on the screen where you input domain settings, open the advanced settings, select **Use a custom return path** and input letters or numbers to build a custom return path. If you don't select these, SendGrid automatically selects them for you. Make sure the characters you select are different from what SendGrid assigned you initially. + +{% anchor h3 %} +Using a custom DKIM selector +{% endanchor %} + +Use a custom DKIM selector if you want to authenticate a single domain multiple times. This works by adding the custom selector to the domain as a custom subdomain. + +*To use a custom DKIM selector:* + +When you are in the process of authenticating a domain, and on the screen where you input domain settings, open the advanced settings, select **Use a custom DKIM selector** and input three letters or numbers to build a custom subdomain. If you don't select these, SendGrid automatically selects them for you. Make sure the three characters you select are different from your original selection. For example, you could use `org` or `001`. + +{% anchor h3 %} +Assigning a subuser +{% endanchor %} + +By assigning an authenticated domain to one of your subusers, you can give them the benefit of improved authentication and security, but also separate from the sending reputation of your parent account. If you assign a subusers domain, they can't edit or delete it. + +*To assign an authenticated domain to a subuser:* + +When you are in the process of authenticating a domain, and on the screen where you input domain settings, open the advanced settings, select **Assign to a subuser**, and select a subuser to assign to that domain. + +{% anchor h2 %} +Migrating from legacy Whitelabel +{% endanchor %} + +If you set up a whitelabel before 2015, your whitelabel will still work. However, if you need to change or update it, you need to delete it and recreate it as an authenticated domain in our new system. + +If you set up a whitelabel after 2015, it has been automatically migrated to our new domain authentication system. + +{% anchor h2 %} +Additional resources +{% endanchor %} + +- [How to set up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) +- [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) +- [Troubleshooting]({{root_url}}/User_Guide/Settings/Sender_authentication/Troubleshooting.html) diff --git a/source/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.md b/source/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.md new file mode 100644 index 0000000000..7acb8c3cd4 --- /dev/null +++ b/source/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.md @@ -0,0 +1,129 @@ +--- +layout: page +weight: 0 +title: How to set up link branding +navigation: + show: true +seo: + title: How to set up link branding + override: true + description: Set up link branding to improve your deliverability and security of your emails. +--- + + + + +- [What is link branding?](#-What-is-link-branding) +- [Key terminology](#-Key terminology) + - [DNS](#-DNS) + - [CDN](#-CDN) + - [CNAME](#-CNAME) +- [Setting up link branding](#-Setting-up-link-branding) + - [Before you begin](#-Before-you-begin) + - [Setting up DNS](#-Setting-up-DNS) +- [Advanced settings](#-Advanced-settings) + - [Using a custom return path](#-Using-a-custom-return-path) + - [Assigning a subuser](#-Assigning-a-subuser) +- [Migrating from legacy Whitelabel](#-Migrating-from-legacy-Whitelabel) + +{% anchor h2 %} +What is link branding? +{% endanchor %} + +Email link branding allows all of the click-tracked links and opens tracked images in your emails to be from your domain instead of from sendgrid.net. Spam filters and recipient servers look at the links within emails to determine whether the email looks trustworthy enough to deliver - they use the reputation of the root domain to determine whether the links can be trusted. Implementing link labeling helps in email deliverability because you are no longer relying on click tracking going through a domain that you do not control. + +{% anchor h2 %} +Key terminology +{% endanchor %} + +{% anchor h3 %} +DNS +{% endanchor %} + +DNS stands for Domain Name System. This is a naming system for domains on the internet. When SendGrid refers to your DNS, we are talking about your domain name that you want to send emails from, or that you want to link images from. When we talk about your DNS provider, we are talking about the service that hosts your domain name. For example, GoDaddy, Rackspace, or Cloudflare. For more information about DNS, see our [DNS glossary page]({{root_url}}/Glossary/dns.html). + +{% anchor h3 %} +CDN +{% endanchor %} + +A CDN (content delivery network) is a network that delivers the content of webpages to the end user. The network selects the servers for delivery based on the location of the end user, the originating location of the webpage and the location of the content delivery server. Content Delivery Networks are a great mechanism that you can use to serve up content very quickly and easily across multiple mediums as well as handle security certificates for you. + +We suggest [CloudFlare]({{root_url}}/User_Guide/Setting_Up_Your_Server/content_delivery_networks.html#-Using-CloudFlare), [Fastly]({{root_url}}/User_Guide/Setting_Up_Your_Server/content_delivery_networks.html#-Using-Fastly), or [KeyCDN]({{root_url}}/User_Guide/Setting_Up_Your_Server/content_delivery_networks.html#-Using-KeyCDN) when using Content Delivery Networks with SendGrid. + +{% anchor h3 %} +CNAME +{% endanchor %} + +The CNAME record creates an alias for subdomain.yourdomain.com and points to sendgrid.net. The CNAME is needed for our click and open tracking features in order for those statistics to be routed back to your SendGrid account. This will also be what your messages are signed by, so your recipients will be able see what you have chosen for your CNAME. You set up the CNAME files that SendGrid provides with your DNS host. For more information about CNAME, see our [CNAME glossary page]({{root_url}}/Glossary/cname.html). + +{% anchor h3 %} +Before you begin +{% endanchor %} + +To set up link branding, you must submit the DNS records provided by SendGrid to your DNS or hosting provider (for example, GoDaddy, Hover, CloudFlare, etc.). First, figure out who your hosting provider is and if you have access. If you don't have access to your DNS or hosting provider, you should figure out who in your company has this access before you begin setting up link branding. + +{% info %} +Note that you can also set up link branding when you set up your domain authentication and you may not need to set it up again. +{% endinfo %} + +*To set up and verify link branding:* + +1. In the SendGrid UI, select [Settings > Sender Authentication](https://app.sendgrid.com/settings/whitelabel). +1. In the link branding section, click **Get Started**. +1. Next, add in information about your DNS host. CLick **Next**. +1. Enter the domain that you want to brand the links and images with and add advanced settings. Make sure that you only enter the name of your root domain. Do not include `www` or `http://www` in this field! Your domain needs to match the domain of your from address on the emails you are sending out. For example, if I am branding with the domain `example.sendgrid.com`, I would set my link branding domain to be `sendgrid.com`. Click **Next**. For more information about advanced settings, see [Advanced settings](#-Advanced-settings). +1. Next, you need to add all of the CNAME records on this screen to your DNS host. This process varies depending on your DNS host. For videos on how to add your CNAME to some popular DNS service providers, check out these [videos](https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/providers.html). If you don't have access to modify your companies DNS records, you can also email a request to a co-worker. This email includes a direct link to the CNAME records. This link does expire. The recipient doesn't need login access to your SendGrid account. + +Now links and images in your emails are from your custom domain. You only need to update your link branding if you want to update the domain that appears in the links in your email. + +It can take up to 48 hours for the records to verify after you upload them into your DNS host, so you will likely have to come back later to verify. + +{% anchor h3 %} +Verifying your DNS +{% endanchor %} + +Once you add the CNAME records to your DNS host, return to the [Sender authentication page](https://app.sendgrid.com/settings/whitelabel) and click **Verify**. + +{% info %} +If you click verify, and only half of your CNAME records verify, this usually means that you need to wait a bit longer. It's also possible that you entered one of your records in incorrectly. For other troubleshooting information, see [Sender authentication troubleshooting]({{root_url}}/User_Guide/Settings/Sender_authentication/Troubleshooting.html). +{% endinfo %} + +Any time that you send an email with image or links that match the branded link, SendGrid applies that link to your email. You only need to update your link branding if you want to update the links used in your emails. + +{% anchor h2 %} +Advanced settings +{% endanchor %} + +{% anchor h3 %} +Using a custom subdomain for links +{% endanchor %} + +*To customize your subdomain:* + +When you are in the process of branding a link, and on the screen where you input domain settings, open the advanced settings, select **Custom subdomain for links** and input letters or numbers to build a custom domain. If you don't select these, SendGrid automatically selects them for you. Make sure the characters you select are different from what SendGrid assigned you initially. + +{% anchor h3 %} +Assigning a subuser +{% endanchor %} + +By assigning a domain whitelabel to one of your subusers, you can give them the benefit of improved authentication and security, but also separate from the sending reputation of your parent account. If you assign a subusers domain, they can't edit or delete it. + +*To assign an authenticated domain to a subuser:* + +When you are in the process of authenticating a domain, and on the screen where you input domain settings, open the advanced settings, select **Assign to a subuser**, and select a subuser to assign to that domain. + +{% anchor h2 %} +Migrating from legacy Whitelabel +{% endanchor %} + +If you set up a whitelabel before 2015, your whitelabel will still work. However, if you need to change or update it, you need to delete it and recreate it as an authenticated domain in our new system. If you do set up a new branded link, make sure to keep the same subdomain for domain authentication, but then use a different one for link branding. + +If you set up a whitelabel after 2015, it has been automatically migrated to our new sender authentication system. + +{% anchor h2 %} +Additional resources +{% endanchor %} + +- [How to set up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) +- [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) +- [Troubleshooting]({{root_url}}/User_Guide/Settings/Sender_authentication/Troubleshooting.html) diff --git a/source/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.md b/source/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.md new file mode 100644 index 0000000000..01830e1fa2 --- /dev/null +++ b/source/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.md @@ -0,0 +1,121 @@ +--- +layout: page +weight: 0 +title: How to set up reverse DNS +navigation: + show: true +seo: + title: How to set up reverse DNS + override: true + description: Set up reverse DNS to improve your deliverability and security of your emails. + keywords: reverse DNS, rDNS, whitelabel, IP whitelabel +--- + + + +{% info %} +You can only set up reverse DNS if you have a dedicated IP. +{% endinfo %} + +- [What is reverse DNS?](#-What-is-reverse-DNS) +- [Key terminology](#-Key terminology) + - [IP Address](#-IP-Address) + - [DNS](#-DNS) + - [A Record](#-A-Record) + - [Subdomain](#-Subdomain) +- [Setting up reverse DNS](#-Setting-up-reverse-DNS) + - [Before you begin](#-Before-you-begin) + - [Verifying](#-Verifying) +- [Reverse DNS for a subuser](#-Reverse-DNS-for-a-subuser) +- [What do I do if I have more than 10 IPs](#-What-do-I-do-if-I-have-more-than-10-IPs) + +{% anchor h2 %} +What is reverse DNS? +{% endanchor %} + +Setting up reverse DNS on an IP address allows mailbox providers to verify the sender when they do a reverse DNS lookup upon receipt of the emails you send. When you update your DNS provider with a DNS record provided by SendGrid, and then send mail over your IP, the recipient's email service provider performs a reverse DNS lookup (rDNS) using an A Record (address record). An A Record maps your domain to your IP address. When a mailbox provider looks up your A Record, they see your SendGrid IP address. When they look at your IP address, they see the rDNS that matches your A Record. This circular checking proves your SendGrid IP association with your domain and your domain association with your SendGrid IP. + +{% anchor h2 %} +Key terminology +{% endanchor %} + +{% anchor h3 %} +IP Address +{% endanchor %} + +An Internet Protocol (IP) Address is a unique numerical address that defines an internet location. These addresses have 4 sets of numbers separated by periods. For example, 127.0.0.1 is an IP address. At SendGrid, you can be on a shared IP address, or you can have a dedicated IP address. We recommend a dedicated IP address for people sending high volumes of email or for people who want control over the quality of mail sent on the same IP as theirs. The aggregate performance of all the senders who use the IP determines its reputation. + +{% anchor h3 %} +DNS +{% endanchor %} + +DNS stands for Domain Name System. This is a naming system for domains on the internet. When SendGrid refers to your DNS, we are talking about your domain name that you want to send emails from. When we talk about your DNS provider, we are talking about the service that hosts your domain name. For example, GoDaddy, Rackspace, or Cloudflare. For more information about DNS, see our [DNS glossary page]({{root_url}}/Glossary/dns.html). + +{% anchor h3 %} +A Record +{% endanchor %} + +The A Record (address record) links your dedicated IP address to your chosen domain. It does this by mapping your domain to your IP address through records that you export from SendGrid and upload into your DNS host. + +If your domain+subdomain is `marketing.example.com`, and your dedicated IP address is `101.10.10.101`, setting up the SendGrid A Record links your domain with your dedicated IP address - so anything sent over your domain associates with your dedicated IP, and anything sent over your dedicated IP associates with your domain. + +{% anchor h3 %} +Subdomain +{% endanchor %} + +A subdomain is a prefix appended to your domain and used for tracking and reporting on your validated IP. Your subdomain cannot be the same as your other IP subdomains. It's a good idea to check your current DNS settings with your DNS provider to confirm that the subdomain you would like to use is available. Try to pick a name for this subdomain that represents the type of email you will send using this new domain whitelabel. For example, "marketing" or "billing". Do not use underscores in your subdomain. We create your DNS records based on the subdomain, and DNS providers do not accept DNS records that contain underscores. + +{% warning %} Your sending reputation is determined by the reputation of your root, or top-level, domain. This is true even if you have several different subdomains with the same authenticate domain. For example, both `billing.example.com` and `marketing.example.com` will share the reputation of `example.com`.{% endwarning %} + +{% anchor h3 %} +Before you begin +{% endanchor %} + +To set up reverse DNS, you must submit the DNS records provided by SendGrid to your DNS or hosting provider (for example, GoDaddy, Hover, CloudFlare, etc.). First, figure out who your hosting provider is and if you have access. If you don't have access to your DNS or hosting provider, you should figure out who in your company has this access before you begin setting up reverse DNS. + +*To set up and verify reverse DNS:* + +1. In the SendGrid UI, select [Settings > Sender Authentication](https://app.sendgrid.com/settings/whitelabel). +1. In the reverse DNS section, click **Get Started**. +1. Next, select the IP to set up reverse DNS. +1. Add a subdomain. For more information about picking a subdomain, see [Subdomains](#-Subdomain). +1. Select or enter a domain you want to associate with the IP. Make sure that you only enter the name of your root domain. Do not include `www` or `http://www` in this field! Your domain needs to match the domain of your from address on the emails you are sending out. For example, if I am setting up the domain `example.sendgrid.com`, I would set my domain to be `sendgrid.com`. Click **Save** and then **Confirm**. An individual IP address can only have one reverse DNS set up. +1. Next, you need to add all of the A Records on this screen to your DNS host. This process varies depending on your DNS host. For videos on how to add your A Records to some popular DNS service providers, check out these [videos](https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/providers.html). + +{% info %} +If you plan to send from multiple domains, you should set up reverse DNS for at least one IP address per domain. +{% endinfo %} + +It can take up to 48 hours for the records to verify after you upload them to your DNS host, so you will likely have to come back later to verify. + +{% anchor h3 %} +Verifying +{% endanchor %} + +Once you add the A Records to your DNS host, return to the [Sender authentication page](https://app.sendgrid.com/settings/whitelabel) and click **Verify**. + +{% info %} +If you click verify, and only half of your A name records verify, this usually means that you need to wait a bit longer. It's also possible that you entered one of your records in incorrectly. For other troubleshooting information, see [Sender authentication troubleshooting]({{root_url}}/User_Guide/Settings/Sender_authentication/Troubleshooting.html). +{% endinfo %} + +Now your dedicated sending IP is associated with your domain. You only need to update your reverse DNS if you add additional dedicated IPs to your account. + +{% anchor h2 %} +Reverse DNS for a subuser +{% endanchor %} + +Only a parent account can set up reverse DNS for an IP address. For a subuser account to have an IP that has reverse DNS set up, the parent account needs to buy the IP, set up reverse DNS and then [assign the IP to the subuser]({{root_url}}/User_Guide/Settings/dedicated_ip_addresses.html#-Assigning-a-Dedicated-IP-address-to-a-subuser). + +{% anchor h2 %} +What do I do if I have more than 10 IPs? +{% endanchor %} + +There is a character limit in SPF (sender policy framework) records that means that if you have more than 10 IP addresses, they will not fit in the record. When this is true, we will provide you with the generic SendGrid SPF record which includes all IPs at SendGrid, not just yours. If you would like to secure your SPF record only to include your IPs, you can chain multiple SPF records together manually. For more information see Open SPF’s [website](http://www.openspf.org/). + +{% anchor h2 %} +Additional resources +{% endanchor %} + +- [How to set up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) +- [How to set up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) +- [Troubleshooting]({{root_url}}/User_Guide/Settings/Sender_authentication/Troubleshooting.html) diff --git a/source/User_Guide/Settings/Sender_authentication/Troubleshooting.md b/source/User_Guide/Settings/Sender_authentication/Troubleshooting.md new file mode 100644 index 0000000000..f705b49b20 --- /dev/null +++ b/source/User_Guide/Settings/Sender_authentication/Troubleshooting.md @@ -0,0 +1,242 @@ +--- +layout: page +weight: 0 +title: Troubleshooting +navigation: + show: true +seo: + title: Troubleshooting + override: true + description: Troubleshoot your sender authentication. +--- + +- [My DNS records aren't validating](#-My-DNS-records-arent-validating) + - [Allow your DNS records to propagate](#-Allow-your-DNS-records-to-propagate) + - [Auto appending](#-Auto-appending) + - [Error validating domain: Expected TXT record at...](#-Error-validating-domain--Expected-TXT-record-at) + - [DNS record duplication](#-DNS-record-duplication) + - [Manually validating records](#-Manually-validating-records) +- [Where is my domain hosted?](#-Where-is-my-domain-hosted) +- [Can I authenticate multiple domains?]() +- [Domain authentication application logic](#-Domain-authentication-application-logic) + +{% anchor h2 %} +My DNS records aren't validating +{% endanchor %} + +After you add your CNAME, TEXT or MX records to your DNS host, you need to validate them in the SendGrid UI. If your DNS records aren't validating, try these steps: + +{% anchor h3 %} +Allow your DNS records to propagate +{% endanchor %} + +Some DNS providers take longer than others to update your DNS records with the CNAME files or TEXT and MX files that we ask you to add. Give it up to 48 hours to validate. + +{% anchor h3 %} +Auto appending +{% endanchor %} + +Some DNS hosts will automatically add your top-level domain to the end of DNS records you create, which can turn a CNAME for “email.domain.com” into “email.domain.com.domain.com”. + +Be sure to follow the convention on existing records in your DNS panel when adding new ones, as sometimes you will only need to add what is to the left of the top-level domain. + +For example, a CNAME for “email.” becomes “email.domain.com” + +{% anchor h3 %} +Error validating domain: Expected TXT record at... +{% endanchor %} + +{% codeblock %} +Error validating domain: +Expected TXT record at "m1._domainkey.example.com" to match "k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHLyl8Wk4J06nv56v5+OeEgp9LW3f/""LOlBjWJ9NS4l9X5UlbPJkKeHDXThTig2CxhVuKmIVvRcc9yJ27Tdthj1C1q0rvRtFpNlHbdrJvD8wpxe5rmFeiRPH1KUYbvtbs84aApMwN6Y3A0dgQE7vGkHnPTjwT7q/xv3mu2CvkVntQIDAQAB", but got the following error: lookup m1._domainkey.example.com: no such host +{% endcodeblock %} + +If you get an error like this, the problem is that the text record has been split up. The solution is to combine the key back together into one set of quotes, which looks something like this: + +{% codeblock %} +"k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHLyl8Wk4J06nv56v5+OeEgp9LW3f/LOlBjWJ9NS4l9X5UlbPJkKeHDXThTig2CxhVuKmIVvRcc9yJ27Tdthj1C1q0rvRtFpNlHbdrJvD8wpxe5rmFeiRPH1KUYbvtbs84aApMwN6Y3A0dgQE7vGkHnPTjwT7q/xv3mu2CvkVntQIDAQAB" +{% endcodeblock %} + +{% anchor h3 %} +DNS record duplication +{% endanchor %} + +Some DNS providers don't automatically prevent you from duplicating a DNS file. For example, there might be an MX and TEXT record where you are trying to set up a CNAME file. If your DNS files aren't validating, check to make sure there are no other DNS records that could be a duplication. + +{% anchor h3 %} +My DNS doesn't accept underscores +{% endanchor %} + +SendGrid requires underscores for sender authentication, but some DNS providers do not support underscores in zone file entries. + +If your provider does not allow you to use underscores in zone files, consider changing your DNS hosting provider. + +You can also disable automated security - this allows you to set up TXT and CX records that don't have underscores. For more information about setting up automated security, see [Using automated security]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html#-Using-automated-security). + +{% anchor h3 %} +Manually validating records +{% endanchor %} + +Sometimes there is no other option but to manually validate your DNS records. This can be caused by certain DNS providers or by customizations you add to your records. + +*To manually validate you DNS files:* + +{% anchor h3 %} +Verify Your DNS Records Manually +{% endanchor %} + +To validate a DNS record manually, use the Unix command `DIG`. These examples use **Terminal** on a Mac platform. + +These tables show specific validations. If the **ANSWER** section of the dig return is empty, that usually means that either the record does not exist or has yet to propagate. + +Examples: + +{% anchor h3 %} +Domains +{% endanchor %} + +{% anchor h4 %} +Automated Security ON +{% endanchor %} + + + + + + + + + + + + + + + + + + + + + + +
    CommandTypeANSWER
    dig cname sub.domain.comCNAMEu123456.wl.sendgrid.net
    dig cname s1._domainkey.sub.domain.comCNAMEs1.domainkey.u123456.wl.sendgrid.net
    dig cname s2._domainkey.domain.comCNAMEs2.domainkey.u123456.wl.sendgrid.net
    + +{% anchor h4 %} +Automated Security OFF +{% endanchor %} + + + + + + + + + + + + + + + + + + + + + + +
    CommandTypeANSWER
    dig mx sub.domain.comMXmx.sendgrid.net
    dig txt m1._domainkey.sub.domain.comTXTk=rsa; t=s; p=MIGfMA0GC...
    dig txt sub.domainkey.domain.comTXTv=spf1 include:sendgrid.net ~all
    + +{% anchor h3 %} +Email Links +{% endanchor %} + + + + + + + + + + + + + + + + + +
    CommandTypeANSWER
    dig cname links.domain.comCNAMEsendgrid.net
    dig cname 123456.domain.comCNAMEsendgrid.net
    + +{% anchor h3 %} +IPs +{% endanchor %} + + + + + + + + + + + + +
    CommandTypeANSWER
    dig a o1.default.domain.comA12.34.56.78 (your SendGrid IP address)
    + +You can also use the [DNSLookup](http://mxtoolbox.com/DNSLookup.aspx) tool provided by MxToolbox: enter the record you would like to check, and hit enter. + +If you can successfully verify your DNS changes manually, but it won't validate in the tool, contact [Support](https://support.sendgrid.com/hc/en-us), and we can help you investigate. + +{% anchor h2 %} +Where is my domain hosted? +{% endanchor %} + +If you aren't sure what DNS provider hosts your domain use this command to find out: + +{% codeblock %} +dig <> ns +{% endcodeblock %} + +{% anchor h2 %} +Can I authenticate multiple domains? +{% endanchor %} + +Yes, it’s possible to authenticate multiple domains. When multiple authenticated domains exist on your account, SendGrid will use the from address for each email you send through SendGrid and match it to a domain and branded link. If the from address does not match an existing authenticated domain, SendGrid will fall back to the domain you have chosen as the default. + +{% anchor h2 %} +Domain authentication application logic +{% endanchor %} + +Run through the application logic to understand why your sent emails may not be using `SendGrid.net` instead of the domain you authenticated. + +{% info %} +If SendGrid cannot match your email to a valid authenticated domain, `SendGrid.net` is used. +{% endinfo %} + +For any account, SendGrid attaches authenticated domain information in the following order, starting at the top of the list and applying the domain when the criteria are matched: + +1. Valid authenticated domain that matches the domain in the FROM address. +1. Valid default authenticated domain. + +*If no valid authenticated domains can be found, your mail domain defaults to sendgrid.net.* + +For subusers, SendGrid attaches authenticated domain information in the following order, starting at the top of the list and applying the domain when the criteria are matched: + +1. Authenticated domain **for this subuser** that matches the domain in the FROM address. +1. Default authenticated domain **for this subuser**. +1. Authenticated domain assigned by the parent account to this subuser. + +*If no valid authenticated domains can be found, the sending domain defaults to sendgrid.net.* + +{% anchor h2 %} +Additional resources +{% endanchor %} + +- [How to set up domain authentication]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html) +- [How to set up link branding]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_link_branding.html) +- [How to set up reverse DNS]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html) diff --git a/source/User_Guide/Settings/Whitelabel/providers.md b/source/User_Guide/Settings/Sender_authentication/providers.md similarity index 80% rename from source/User_Guide/Settings/Whitelabel/providers.md rename to source/User_Guide/Settings/Sender_authentication/providers.md index e8bdda6d9f..d4a2b40736 100644 --- a/source/User_Guide/Settings/Whitelabel/providers.md +++ b/source/User_Guide/Settings/Sender_authentication/providers.md @@ -4,8 +4,8 @@ st: type: User_Guide seo: title: DNS Providers - description: Find Whitelabel help specific to your DNS Provider... - keywords: whitelabel, dns, provider, spf, dkim, dmarc, godaddy, hover + description: Here are guides for setting up sender authentication with specific DNS providers + keywords: whitelabel, dns, provider, spf, dkim, dmarc, godaddy, hover, sender authentication title: DNS Providers weight: 0 layout: page diff --git a/source/User_Guide/Settings/Subusers/impersonation.md b/source/User_Guide/Settings/Subusers/impersonation.md deleted file mode 100644 index 4deac4ecc5..0000000000 --- a/source/User_Guide/Settings/Subusers/impersonation.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -layout: page -weight: 0 -title: Impersonation -seo: - title: Subusers Impersonation - description: Impersonate a subuser so you can see their specific settings. - keywords: subuser impersonation, login as subuser, manage subuser, act as subuser -navigation: - show: true ---- - -When you set up subusers, whether for segmentation of sending or for other functional reasons, it may be useful to see what the subuser’s settings are and to see what the subuser can see in the SendGrid UI. - -To assist you,, we’ve made it so you can impersonate a subuser from your parent account and then manage the subuser the same way as if you had logged in with that user’s credentials, without having to log out of your parent account. - -{% anchor h2 %} -How To Impersonate A Subuser -{% endanchor %} - -1. Log into the SendGrid UI, if you aren’t already logged in. -2. Go to the top left corner of the portal screen and click on your name just above the navigation menu. -3. Click “Switch User” -4. Choose the subuser you want to impersonate by clicking that subuser’s name - -The page will refresh and you will notice a message at the top of the screen that says, “[your username], you are currently logged in as [subuser name]” - -You can also switch to another subuser by clicking the “Switch Subuser” link at the top right corner once you are impersonating any subuser. - -{% anchor h2 %} -Getting Back To Your Parent Account -{% endanchor %} - -Click the link at the top left that says “<- Back to Parent Account”. This will log you out of the subuser account and take you back to your parent account portal. diff --git a/source/User_Guide/Settings/Subusers/index.html b/source/User_Guide/Settings/Subusers/index.html deleted file mode 100644 index 8676ca9481..0000000000 --- a/source/User_Guide/Settings/Subusers/index.html +++ /dev/null @@ -1,104 +0,0 @@ ---- -layout: page -weight: 100 -title: Subusers Overview -seo: - title: Create and Manage Subusers - description: Create and Manage your Subusers - keywords: subuser settings, create subuser, manage subuser, delete subuser -navigation: - show: true ---- - -{% info %} -If you have a **Pro plan or higher**, you may create up to 15 subusers through your account. If you reach the maximum of 15 and require more subusers, please use the form in the Subuser Management page to request more. -{% endinfo %} - -Subusers are SendGrid accounts that belong to a parent account. They have their own permissions and credit limits, which you assign as you create the subusers. Subusers are provided in order to help you segment your email sending and API activity. We suggest our customers create subusers for each of the different types of emails they send. This often means one subuser for transactional emails and one for marketing emails; however some of our customers will break up their sending across multiple subusers in order to segment the statistics for each type or function of email they send. - -{% anchor h2 %} -Manage Subusers -{% endanchor %} - -Subusers can be managed via Subuser API or by logging into your SendGrid account under Settings > Subuser Management. - -To manage a Subuser, click the name of the Subuser. This will take you to the Subuser’s account and profile settings. From there, you can manage and update your Subuser Settings. - -{% anchor h2 %} -Create a Subuser -{% endanchor %} - -When your account is created with SendGrid, you do not have any subusers initially. - -To create a subuser, first visit Settings > Subuser Management, then click the “Create New Subuser” button at the top of the page. - -When you’re done entering information, click the blue “Create Subuser” button at the top of the subuser window. You will be taken to the subuser’s profile page. - -{% info %} -You can have 15 subusers. If you need more, please contact SendGrid support. -{% endinfo %} - -Username - The username your subuser will use to send email and access the API. - -Email Address - The contact email address for this subuser. This must be an active email account as SendGrid may contact a subuser to provide support, resolve sending and deliverability issues, or to enforce SendGrid's Terms of Service. Whenever we contact a subuser, it is our policy to contact the parent account email address at the same time. - -Password - The password your subuser will use to access SendGrid.com. - -Confirm Password - Confirm the password above was typed correctly. - -Avatar - A gravatar will load when an email address is entered, making it easier to identify your subusers in the subuser list. - -{% warning %} -One email credit will be charged for every monitor email that is sent. -{% endwarning %} - -Email Monitor - By default, this feature is off. To turn it on, click the “off” button. You will be shown a form that allows you to set the frequency that SendGrid will test emails and the address to which these emails will be forwarded. - -The “Collect Sample Rate” is the number of emails SendGrid will allow your account to send before copying the email address you set on the next email sent. For example, if you set the collect sample rate at 100, then you will receive a copy of every 100th email this subuser sends. - -{% info %} -Keep in mind that the subusers assigned to an IP address will effect the sending reputation of that IP address. This can include both the parent account and other subuser accounts assigned to that IP. All account plans below Pro 100k share an IP address with other users on the same account level. Upgrading to Pro 100k plan or higher includes a dedicated IP address. This means that your account and subusers sending practices alone effect the sending reputation of the IP addresses assigned to your account. -{% endinfo %} - -IP Addresses - -When you create a SendGrid account and select a Pro plan or higher, your account is assigned to a dedicated IP address. All of your mail sent through SendGrid will show as originating from this IP address, unless you have purchased additional IPs and assigned IP addresses to them or set up IP Pools. - -We give you the same functionality when you create your subusers. Simply select the IP address you would like this subuser to send from. We will show you which other users are assigned to the same IP address, so you can keep similar senders together. - -If you need more IP addresses, please contact SendGrid support. - -{% anchor h2 %} -Optional Profile Information -{% endanchor %} - -We do not require this information for your subusers, but we suggest that you fill out as much as possible to improve the deliverability for this subuser, especially if the information does not match your parent account’s information. This will also allow SendGrid to contact your subuser directly if we notice anything on their account. - -First Name - The first name of the person responsible for this subuser. - -Last Name - The last name of the person responsible for this subuser. - -Company - The name of your subuser’s company. - -Address 1 - The first line of your subuser’s address. - -Address 2 - The second line of your subuser’s address. - -City - The city in which your subuser operates. - -State - The state or province in which your subuser operates. - -Country - The country in which your subuser operates. - -Zip - The zip code in which your subuser operates. - -Company Phone Number - The phone number for your subuser’s business. - -Company Website - The website for your subuser’s business. - - -{% anchor h2 %} -Export Subuser Information -{% endanchor %} - -If you would like to see how your subusers are performing in comparison to each other, simply click on the “Export” button on the main subuser page. This will create a CSV file that will have each subuser’s reputation, number of requests each subuser made this month, and the number of requests each subuser made last month. diff --git a/source/User_Guide/Settings/Subusers/profile.md b/source/User_Guide/Settings/Subusers/profile.md deleted file mode 100644 index ab61b2f674..0000000000 --- a/source/User_Guide/Settings/Subusers/profile.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -layout: page -weight: 0 -title: Profile -seo: - title: Subusers Profile - description: The subuser profile allows you to see your subuser settings at a glance. - keywords: subuser settings, subuser edit, subuser profile settings -navigation: - show: true ---- - -{% anchor h2 %} -Contact Information -{% endanchor %} - -This section will show you the contact information you put in when you created your subuser. To modify this subuser, click the “Change Contact” button, add your new information, and then click “Save.” - -**Avatar** - A [gravatar](http://gravatar.com) will load when an email address is entered, making it easier to identify your subusers in the subuser list. - -**First Name** - The first name of the person responsible for this subuser. - -**Last Name** - The last name of the person responsible for this subuser. - -**Email Address** - The contact email address for this subuser. This must be an active email account as SendGrid may contact a subuser to provide support, resolve sending and deliverability issues, or to enforce [SendGrid's Terms of Service](https://sendgrid.com/tos). Whenever we contact a subuser, it is our policy to contact the parent account email address at the same time. - -{% anchor h2 %} -Username & Password -{% endanchor %} - -We do not require this information for your subusers, but we suggest that you fill out as much as possible to improve the deliverability for this subuser, especially if the information does not match your parent account’s information. This will also allow SendGrid to contact your subuser directly if we notice anything on their account. - -**Username** - The username your subuser will use to send email and access the API. - -**Password** - The password your subuser will use to access SendGrid.com. - -**Confirm Password** - This field only shows when you’re changing your password. It is used to confirm the password above was typed correctly. - -{% anchor h2 %} -Company Information -{% endanchor %} - -**Company** - The name of your subuser’s company. - -**Address 1** - The first line of your subuser’s address. - -**Address 2** - The second line of your subuser's address, if your subuser has one. - -**City** - The city in which your subuser operates. - -**State** - The state or province in which your subuser operates. - -**Country** - The country in which your subuser operates. - -**Zip** - The zip code in which your subuser operates. - -**Company Phone Number** - The phone number for your subuser’s business. - -**Company Website** - The website for your subuser’s business. diff --git a/source/User_Guide/Settings/Subusers/settings.md b/source/User_Guide/Settings/Subusers/settings.md deleted file mode 100644 index 71725e2d33..0000000000 --- a/source/User_Guide/Settings/Subusers/settings.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -layout: page -weight: 0 -title: Settings -seo: - title: Subusers Settings - description: Create and Manage your Subusers - keywords: subuser settings, create subuser, manage subuser, delete subuser -navigation: - show: true ---- - -When you create a subuser, you are given the basic options for setting up that subuser. Immediately upon saving, you will be taken to the subuser settings page. You can also get to this page by clicking the subuser’s name from the main subuser list. -From this page, you get a quick overview of the subuser’s sending behavior and you can change everything about your subuser, restricting or allowing the mail sending capabilities of this subuser. - -{% anchor h2 %} -Subuser Behavior -{% endanchor %} - -The top block of information on your settings page is designed to give you at-a-glance information about your subuser’s sending behavior within SendGrid. It is important to keep an eye on your subuser’s behavior, because you are responsible for all the subusers you create. - -**Requests** - The number of API requests that this subuser made during the current month. This is not necessarily individual email sent since one request can be used to send multiple emails. - -**Reputation** - If a subuser’s [reputation]({{root_url}}/Glossary/reputation_monitoring.html) goes down, it is likely that subuser will no longer be able to send emails through SendGrid. - -**Opens** - The number of times this subuser’s emails were opened this month. - -**Clicks** - The number of times links from this subuer’s emails were clicked this month. - - -{% anchor h2 %} -Credit Allocation -{% endanchor %} - -Each subuser will be automatically configured to have access to Unlimited email credits from your parent account. This is so that your subusers can send emails from the moment you create them. It is up to you to set how these credits are allocated once you’ve create the subuser’s account and we give you a couple of options. - -**Unlimited Credits** - The default credit allocation setting for all new subusers. This allows your subuser to send as many emails as they need, up to and through the limitations on your parent account. - -**Recurring Credits** - Allows a certain number of email credits to be allocated to this user per day, week, or month - use it or lose it. Once the limit is reached, the user’s requests to send emails will be denied by SendGrid. - -**Nonrecurrent Credits** - The number of credits this subuser has will not change on a schedule, the credits you give are the credits this subuser has, unless you allocate more credits either manually or via the API. - -{% anchor h2 %} -Allocating or Removing Credits From a Subuser -{% endanchor %} - -{% warning %} -This feature only makes changes to a subuser when the nonrecurring credit option is selected for this subuser. -{% endwarning %} - -If your subuser has been allocated nonrecurring credits, then this feature will allow you to allocate credits to, or remove credits from this subuser account. Simply click the “Change Credit Rules” button and then choose whether to add or subtract credits for this subuser. - -{% anchor h2 %} -Select Whitelabel -{% endanchor %} - -Just as your parent account will send from a specific IP address, so will your subuser accounts. This allows you flexibility with your subusers so that you can segment them by email type, usage, or any number of other categories to protect the reputation of the IP addresses you have from each other. - -When you create your subuser, you are given the option to select which IP address they should send from, but if you ever need to change the IP address, you can do it from here. If you choose multiple IPs, SendGrid will alternate between the IP addresses to send emails for this subuser. - -{% anchor h2 %} -Email Monitor -{% endanchor %} - -{% warning %} -One email credit will be charged for every monitor email that is sent -{% endwarning %} - -This feature is also turned off by default. When you turn this feature is on, by clicking the “off” button, you will be shown a form that allows you to set the frequency SendGrid will test emails and the address to which these emails will be forwarded. - -The “Collect Sample Rate” is the frequency is the number of emails SendGrid will allow through before copying the email address you set on the next email sent. For example, if you set the collect sample rate at 100 then you will receive a copy of every 100th email this subuser sends. - -{% anchor h2 %} -Disable Subuser Account -{% endanchor %} - -To turn off a subuser’s access to SendGrid temporarily, click the “Enabled” button. The button will switch to a yellow “Disabled” button. - -To re-enable a subuser’s account, simply click the “Disabled” button and it will switch back to a green “Enabled” button. - -{% anchor h2 %} -Delete Account -{% endanchor %} - -{% warning %} -Deleting a subuser account cannot be undone. Please make sure that you are ready to delete this account before you delete it. All access for this subuser will immediately be revoked upon deletion. -{% endwarning %} - -To delete a subuser account, click the red "Delete" button and click the “Confirm” button in the confirmation window that pops up. This cannot be undone, so be sure that you actually want to delete this account! diff --git a/source/User_Guide/Settings/Whitelabel/domains.md b/source/User_Guide/Settings/Whitelabel/domains.md deleted file mode 100644 index af07414c7d..0000000000 --- a/source/User_Guide/Settings/Whitelabel/domains.md +++ /dev/null @@ -1,203 +0,0 @@ ---- -layout: page -weight: 0 -title: Domains -seo: - title: Whitelabel Domains - description: Whitelabeling domains allows you to use your domain's reputation when sending. - keywords: whitelabeling, domain Whitelabeling -navigation: - show: true ---- - - - -{% info %} -When in doubt, contact your DNS registrar or web hosting service's technical support department. All information in this document complies with the DNS standards, but some registrars and web hosting providers handle things differently. -{% endinfo %} - -SendGrid’s domain whitelabel allows you to whitelabel your domain and get rid of the “via sendgrid.net” message on your emails, even if you don’t have a dedicated IP address with SendGrid. You can start to build your domain’s email reputation and explicitly show all your recipients that you actually sent these emails. This should help increase your deliverability rates and reduce your potential for spam reports. - -Whitelabeling is critical to your reputation as a sender. Inbox providers distrust messages that are not properly whitelabeled, and you will not be able to begin building your reputation until you complete the whitelabeling process. - -There are a few quick points worth highlighting before you dive into the whitelabeling process. - -* You can only create one whitelabel per domain. -* The domain whitelabeling process requires you to create a subdomain of your root domain to whitelabel and send email from. -* Your reputation is always attributed to your root domain, regardless of the subdomain you whitelabel, or even if you switch subdomains. - -If you have three different subdomains that you have whitelabled and send email from, they will all share the same reputation. - -For example: **marketing.yourdomain.com**, **billing.yourdomain.com**, and **support.yourdomain.com** will all contribute to, and share the reputation of, **yourdomain.com**. - -* You can only have one default whitelabel at a time. By setting a new whitelabel as default, it will replace any other whitelabel you previously set as the default. -* Regardless of whether you choose to use automated or manual security, you will still have to manually add new DNS entries to your DNS or hosting provider. -* Subusers can only access their own whitelabels. They cannot access the parent whitelabels or whitelabels created by other subusers. -* All whitelabels must be verified before they can be used. - -We provide all the information about every step of the process below, so that you can set up your whitelabel quickly and easily. - -{% info %} -Marketing Campaigns [Sender Identities]({{root_url}}/User_Guide/Marketing_Campaigns/senders.html) that use the same domain as your domain whitelabel will automatically verify. -{% endinfo %} - -{% anchor h2 %} -Domain Whitelabel Settings -{% endanchor %} - -{% anchor h3 %} -On Behalf of User -{% endanchor %} - -This setting lets you assign a whitelabel to a subuser account or your parent account. A subuser can set up their own whitelabel, but if the parent account assigns a whitelabel to a subuser, that subuser will not be able to edit or modify the settings of the assigned whitelabel. - -{% anchor h3 %} -Subdomain -{% endanchor %} - -This is the “prefix” of the domain that you are actually whitelabeling. Historically, we have suggested prefixes like “em,” “em1,” etc. However, you can use whatever subdomain you would like to use. - -We do not suggest that you use “mail” as the name of your subdomain, because this is a subdomain that many registrars or hosting companies will automatically set up for your personal email usage. This can cause conflicts that may impact your email reputation. - -{% warning %} -The subdomain that you use for your domain whitelabel must be different from the subdomain for your link whitelabel because each whitelabel must have their own unique CNAME records! -{% endwarning %} - -Even though your domain whitelabel and email link whitelabel use different subdomains, the reputation of your root domain and your IP address are what recipient servers and spam filters use to determine whether or not your email is delivered. - -{% anchor h3 %} -Domain -{% endanchor %} - -{% warning %} -If you add a new default domain whitelabel for a domain that is already whitelabeled on your account, you risk invalidating and removing the default status of the previously set up whitelabel. -{% endwarning %} - -{% info %} -Your domain whitelabel will not affect your email link whitelabel and vice versa. -{% endinfo %} - -The domain is the root domain for your subdomain. This is the domain that will receive the email reputation from the whitelabel. Your root domain should match your FROM email address. If you are sending from newsletter@example.com, then you should whitelabel subdomain.example.com, so the root domains match. - -{% anchor h3 %} -Use New Domain -{% endanchor %} - -Allows you to add a new domain to your whitelabel options. - -{% anchor h3 %} -Default Whitelabel -{% endanchor %} - -{% info %} -You can only have one default whitelabel. -{% endinfo %} - -Your default whitelabel is your fallback when you send emails. It will be used for all sending on your account, unless you have multiple valid whitelabels and one of them matches your FROM email domain. If there is no valid whitelabel that matches the domain in your FROM email address, then your whitelabel will fall back to your default domain whitelabel. For more information, see the [Whitelabel Application Logic]({{root_url}}/User_Guide/Settings/Whitelabel/index.html#-Whitelabel-Application-Logic). - -{% anchor h3 %} -Automated Security -{% endanchor %} - -{% warning %} -We recommend avoiding the use of underscores in your subdomains because many DNS providers do not accept CNAME records that include underscores. - -If your DNS provider doesn't support underscores in CNAME records, you will have to disable automated security to use a different set of DNS records. -{% endwarning %} - -Instead of managing your DNS records for every single change you make, SendGrid can manage your SPF and DKIM record updates for you. This option will change the DNS records that you point at SendGrid for your domain, allowing the responsibility of updating the records to pass through to SendGrid. This means that DKIM and SPF records will all be handled by SendGrid once this whitelabel is verified. - -If you choose not to have SendGrid manage your DNS records, then you’ll be shown all of the manual DNS records that you need to enter at your registrar or host. You will be responsible for making any updates to your DNS settings for any changes on your account. The records you are given will be MX, DKIM, and SPF records to enter at your registrar, hosting company, or DNS manager. This will also mean that your SPF record will include all of SendGrid’s IP addresses. - -**It is important to remember that you will always be provided with a custom DKIM signature, regardless of whether or not you use automated security.** However, with automated security turned off, SendGrid will not automatically update your DKIM signature whenever you make a change to your account that could affect your DNS records (like adding a dedicated IP). - -If you turn off automated security, you will be responsible for updating your DNS records whenever you upgrade your account or add additional dedicated IPs. For example, with automated security turned off, you will have to manually add your new IP addresses to your SPF record from your whitelabel settings. Once you have updated these DNS records, your outbound mail will continue to be signed using your custom DKIM signature. - -{% anchor h3 %} -Creating a Domain Whitelabel -{% endanchor %} - -When you enter the information for your whitelabel and click “Save,” SendGrid will update its own internal DNS to prepare for your whitelabel settings. This process may take up to 20 seconds. - -We will then give you the DNS records that you need to give your DNS provider. - -{% info %} -You may create up to a maximum of 1500 domain whitelabels. -{% endinfo %} - -{% anchor h3 %} -Validate Your Domain Whitelabel -{% endanchor %} - -{% warning %} -SendGrid will not start using your whitelabels until they are validated! Until they are validated, you will still see "via sendgrid.net" on your emails. -{% endwarning %} - -Once you have made the DNS changes, you need to validate your whitelabel: - -1. Click **Settings** in the left hand sidebar. Under **Whitelabels**, click **Domains**. -2. Click the gear icon next to your new whitelabel and click **Validate**. -3. Alternatively, if you are viewing your new domain whitelabel, simply click the **Validate** button - -If everything is set up properly and the DNS records have propagated, then SendGrid will verify your whitelabel and begin to apply this whitelabel to your emails according to SendGrid's [Whitelabel Application Logic]({{root_url}}/User_Guide/Settings/Whitelabel/index.html#-Whitelabel-Application-Logic). - -If you are having trouble validating your DNS records, please see this [helpful Classroom article]({{root_url}}/Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.html). - -{% anchor h2 %} -Changing or Replacing a Domain Whitelabel -{% endanchor %} - -{% anchor h3 %} -Examples of Why You Might Change or Replace a Domain Whitelabel -{% endanchor %} - -1. If you were a SendGrid customer before May 27th, 2015 and you want to update to the new whitelabel system. -2. You want to change your domain whitelabel -3. [You add IP address to your SendGrid account]({{root_url}}/Classroom/Basics/Account/adding_an_additional_dedicated_ip_to_your_account.html) - -The steps for changing or replacing a whitelabel are easy! - -1. Follow the steps to create a new whitelabel -2. Verify your whitelabel - -That's it! Easy! - -{% anchor h2 %} -Managing and Viewing Your Domain Whitelabel -{% endanchor %} - -If you need to check the status of a whitelabel, you can see the “at a glance” information from the Domains Whitelabel page. However, if you’re looking for more in-depth information or you need to find the DNS settings for your whitelabel then just click the gear icon next to the whitelabel and select **View**. - -From this page, you’ll be able to see all of the settings you entered when setting up your whitelabel, whether or not the whitelabel is valid, and all of the DNS settings you need for this whitelabel. - -{% anchor h3 %} -Adding an IP Whitelabel to Your Account -{% endanchor %} - -When you add an IP address to your SendGrid account and you have automated security turned on, SendGrid will add your IPs to your SPF record automatically. When you get to 10 IPs, we will use SendGrid.net ~all due to the character limitation of SPF records. - -If you have more than 10 dedicated IP addresses, we recommend that you manually control your DNS records and chain your SPF records as well. - -If you have automatic DNS security turned off, you will need to manually add your IPs to your SPF records each time you purchase a new IP address. - -{% anchor h2 %} -Deleting a Domain Whitelabel -{% endanchor %} - -{% info %} -You cannot recover deleted domain whitelabels. -{% endinfo %} - -To delete one of your domain whitelabels, navigate to your domain whitelabel settings and click the action cog next to the whitelabel you want to delete and click **Delete**. Alternatively, if you are already viewing the details for your domain whitelabel, click the **Delete** button in the bottom right hand corner. - -{% info %} -You can NOT delete the default domain whitelabel. You must replace it if you want to change it. -{% endinfo %} - -Once deleted, the internal SendGrid DNS entries will be deleted and any email you send will revert to the appropriate whitelabel settings according the Whitelabel Application Logic. - -{% anchor h2 %} -Using the API -{% endanchor %} - -[Manage your domain whitelabel via our v3 Web API!]({{root_url}}/API_Reference/Web_API_v3/Whitelabel/domains.html) diff --git a/source/User_Guide/Settings/Whitelabel/faq.md b/source/User_Guide/Settings/Whitelabel/faq.md deleted file mode 100644 index 145120e5d9..0000000000 --- a/source/User_Guide/Settings/Whitelabel/faq.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -layout: page -weight: 0 -title: FAQ -seo: - title: Whitelabel FAQ - description: Frequently asked questions about SendGrid Whitelabel - keywords: whitelabel faq, domain whitelabel faq, email link faq -navigation: - show: true ---- - - -{% anchor h2 %} -What is whitelabeling? -{% endanchor %} - -The whitelabeling process involves the creation of several new DNS records including establishing a new subdomain (like em.example.com) in your domain registrar pointing to SendGrid. These DNS records ensure compliance with popular email standards, as well as give SendGrid express permission to deliver your mail by authenticating your outbound mail with your domain. - -{% anchor h2 %} -Does whitelabeling require a certain type of account? -{% endanchor %} - -[Domain]({{root_url}}/User_Guide/Settings/Whitelabel/domains.html) and [email link]({{root_url}}/User_Guide/Settings/Whitelabel/links.html) whitelabeling are available for all SendGrid users, no matter the account type. However, the IP whitelabeling process revolves around one central element: the dedicated IP address. Customers at SendGrid with a Pro account or higher are automatically assigned one dedicated IP address, which they whitelabel for their outbound mail. During this process, one of the DNS records that must be hosted is an A record, which specifies that all mail going out along this dedicated IP address is authorized to send mail on behalf of your domain. - -{% anchor h2 %} -What is domain whitelabeling? -{% endanchor %} - -[Domain whitelabeling]({{root_url}}/User_Guide/Settings/Whitelabel/domains.html) adds an SPF (Sender Policy Framework) record to your domain and DKIM (DomainKeys Identified Mail) entries, which effectively authorizes and authenticates SendGrid sending on behalf of your domain. Choosing SendGrid's new automated domain whitelabeling feature allows SendGrid the ability to securely manage your account’s DKIM and SPF records. Domain whitelabeling is the best way to get rid of the "sent on behalf of" or "via" message that some email providers display. - -{% anchor h2 %} -What is email link whitelabeling? -{% endanchor %} - -[Email Link whitelabeling]({{root_url}}/User_Guide/Settings/Whitelabel/links.html) adds a CNAME record for a subdomain that you choose, which masks click and open tracking links to your domain rather than a SendGrid domain. This increases deliverability, builds trust, and strengthens your brand in your emails. - -{% anchor h2 %} -What is IP whitelabeling? -{% endanchor %} - -[IP whitelabeling]({{root_url}}/User_Guide/Settings/Whitelabel/ips.html) adds an A record on a subdomain that points directly to your unique sending IP address. This further increases trust and improves deliverability of your email. - -{% anchor h2 %} -How do I whitelabel? -{% endanchor %} - -Each whitelabel type is a two-step process: - -1. SendGrid will generate DNS records that you must add to your domain host (GoDaddy, Network Solutions, Hover, etc.). -2. Click the gear icon in line with your domain name on the main whitelabel page, then select “validate” in the dropdown list to initiate a check that ensures the records on your DNS host match the records SendGrid generated. - -{% anchor h2 %} -Can I whitelabel multiple domains? -{% endanchor %} - -Yes, it's possible to whitelabel multiple domains using the improved whitelabel management process. When multiple whitelabel domains exist on your account, SendGrid will use the from address for each email you send through SendGrid and match it to a domain and link whitelabel. If the from address does not match an existing whitelabel, SendGrid will fall back to the whitelabel you have chosen as the default. - -{% anchor h2 %} -Why whitelabel? -{% endanchor %} - -Have you ever noticed that email you send through your SendGrid account displays “sent on behalf of” or “via sendgrid.me” and wondered how to get rid of it? Have you noticed that click tracking links point to a SendGrid domain rather than your domain? Whitelabeling effectively masks SendGrid's delivery and click/open tracking to your domain, giving your emails a consistent and professional appearance where all links and sources point back to your domain. - -{% anchor h2 %} -What do I do if I have more than 10 IPs? -{% endanchor %} - -There is a character limit in SPF records that means that if you have more than 10 IP addresses, they will not fit in the record. When this is true, we will provide you with the generic SendGrid SPF record which includes all IPs at SendGrid, not just yours. If you would like to secure your SPF record to only include your IPs, you can chain multiple SPF records together manually. For more information see [Open SPF's website](http://www.openspf.org/Introduction). - -{% anchor h2 %} -What's with the second email link domain? Will that be used to track my links? -{% endanchor %} - -The second link domain is generated by SendGrid and is strictly used to validate that the user who is setting up the email link whitelabel is actually in ownership of that domain. If the user is not able to setup the second link CNAME, they will not be able to validate their link whitelabels. That secondary CNAME will never be used to for click tracking. - - -{% anchor h2 %} -Related Articles -{% endanchor %} - -* [All You Need To Know About Whitelabeling]({{root_url}}/Classroom/Deliver/Delivery_Introduction/all_you_need_to_know_about_whitelabeling.html) -* [I have created DNS records, but SendGrid is not validating them.]({{root_url}}/Classroom/Troubleshooting/Authentication/i_have_created_dns_records_but_the_whitelabel_wizard_is_not_validating_them.html) -* [Open SPF](http://www.openspf.org/Introduction) -* [Whitelabel - Do I need to make DNS changes?]({{root_url}}/Classroom/Deliver/Delivery_Introduction/whitelabel_do_i_need_to_make_dns_changes_pro_and_higher.html) diff --git a/source/User_Guide/Settings/Whitelabel/index.html b/source/User_Guide/Settings/Whitelabel/index.html deleted file mode 100644 index 2b9a749290..0000000000 --- a/source/User_Guide/Settings/Whitelabel/index.html +++ /dev/null @@ -1,107 +0,0 @@ ---- -layout: page -weight: 100 -title: Overview -seo: - title: Whitelabel Overview - description: Whitelabeling allows you to use your own domains for sending email and click tracking. - keywords: whitelabeling, domain whitelabel, email link, IP whitelabeling -navigation: - show: true ---- - - -Whitelabeling is the functionality that shows ISPs that SendGrid has your permission to send emails on your behalf. This permission is given by the act of pointing very specific DNS entries from your domain registrar to SendGrid. Once these DNS entries are entered and propagated, recipient email servers and services will read the headers on the emails you send and check the DNS records to verify the email was initiated at a trusted source. This drastically increases your ability to deliver email and allows you to begin building a sender reputation for your domain and your IP addresses. - -{% info %} -SendGrid does not host domains. Do not attempt to transfer a domain to SendGrid. If you have already registered a domain, then you have a registrar, and it is often the hosting company where your website resides. -{% endinfo %} - -{% warning %} -Any changes you make to DNS can immediately affect your client’s ability to reach your resources. We cannot take any responsibility for any changes you make to DNS, so please be very careful. If you have any questions, please contact our support team. -{% endwarning %} - -{% anchor h2 %} -The Types of Whitelabeling -{% endanchor %} - -

    Domain Whitelabel

    - - - -This type of whitelabel allows recipient email servers and services to verify the identity of the email sender back to the domain that the sender controls. This gives a layer of email authentication that helps in email deliverability. With only the domain whitelabel, you are still subject to the reputation of your IP address. - -

    Email Links Whitelabel

    - - - -When you put a link or an image into an email and have click or open tracking turned on, the click tracking links and the images will point to your domain. This shows the recipient email server that you are not trying to hide anything behind the links and that you control the content of your emails. - -Some bad actors will use 3rd party link shortening services to populate the domains they list in their email content and they do not include their own domain in those links. This practice is a red flag to spam filters. - -

    IP Addresses Whitelabel

    - - - -An IP whitelabel works in tandem with your domain whitelabel, but the real reputation for email is usually associated with the IP address since many domains can point to the same IP. It is always ideal to have both a domain and an IP whitelabel. You will need to have a dedicated IP address or purchase one through SendGrid Support in order to whitelabel your IP address. You can send email from multiple domains from each of your dedicated IPs. Remember that each domain will positively or negatively affect the other domains when you use the same IP for multiple domains. - -{% anchor h2 %} -Setting Up Whitelabels -{% endanchor %} - -You can set up your whitelabels from the overview page or from the individual whitelabel type pages in the UI. For the purposes of the User Guide, we cover each set up process in depth on the following pages: - - -{% anchor h2 %} -How Does Whitelabeling Work? -{% endanchor %} - -{% anchor h3 %} -Recipient Servers Check Your Email Headers -{% endanchor %} - -When your recipient’s servers receive emails, it’s their job to protect their users from unwanted mail. They assume all mail is guilty until proven innocent, so as the sender, it’s your responsibility to provide as much information about yourself as possible. The recipient server will check the email headers for sender identification information and originating server information. - -One of the most basic things that mail servers will check is the FROM address and whether it matches the domain of the sending server. If it doesn’t, on some email applications, your recipients will see something like “via sendgrid.net” in the header of the delivered email. - -{% anchor h3 %} -SendGrid Attaches Whitelabel Information In Email Headers -{% endanchor %} - -When you tell SendGrid to send emails on your behalf, whether manually or over the API, SendGrid will add headers to your emails about you and your email settings so that recipient servers know that we send your emails with your permission and on your behalf. - -If you don’t have a domain whitelabel set up, then your emails will show as being sent by sendgrid.net regardless of your FROM address. - -{% anchor h3 %} -Whitelabel Application Logic -{% endanchor %} - -Assigning whitelabels in email headers takes some care and consideration. SendGrid takes care of this process so that you don’t have to worry about it, but you should know how it works. - -{% info %} -If SendGrid cannot match your email to a valid whitelabel, SendGrid.net will be used. -{% endinfo %} - -For any account, SendGrid will attach valid whitelabel information in the following order, starting at the top of the list and applying the whitelabel when the criteria are matched: - -
      -
    1. Valid whitelabel that matches the domain in the FROM address.
    2. -
    3. Valid default whitelabel.
    4. -
    - -If no valid whitelabels can be found, we will default to sendgrid.net. - -For subusers, SendGrid will attach valid whitelabel information in the following order, starting at the top of the list and applying the whitelabel when the criteria are matched: - -
      -
    1. Valid whitelabel for this subuser that matches the domain in the FROM address.
    2. -
    3. Valid default whitelabel for this subuser.
    4. -
    5. Valid whitelabel assigned by the parent account to this subuser.
    6. -
    - -If no valid whitelabels can be found, we always default to sendgrid.net. diff --git a/source/User_Guide/Settings/Whitelabel/ips.md b/source/User_Guide/Settings/Whitelabel/ips.md deleted file mode 100644 index c518647120..0000000000 --- a/source/User_Guide/Settings/Whitelabel/ips.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -layout: page -weight: 0 -title: IPs -seo: - title: IP whitelabel - description: Whitelabel IPs to control your email sending reputation. - keywords: ip whitelabel, whitelabel IPs -navigation: - show: true ---- - - - -{% info %} -If you plan to send from multiple domains, you should whitelabel at least one IP address per domain. -{% endinfo %} - -Whitelabeling IP addresses allows mailbox providers to verify the sender when they do a reverse DNS lookup upon receipt of the emails you send. This differs from domain whitelabeling in that, while you should have your IP addresses in your SPF records, actually whitelabeling the IP addresses does not require a change to SPF or DKIM records. - -{% info %} -Only the parent account can whitelabel IP addresses. The parent account can then assign the IPs to the subusers accordingly. -{% endinfo %} - -An individual IP address can only be whitelabeled to a single domain, but a domain can have many IPs whitelabeled to it. This allows for you to use IP pooling for your email sending. - -{% anchor h2 %} -IP Whitelabel Settings -{% endanchor %} - -{% anchor h3 %} -IP Address -{% endanchor %} - -The list of the IP addresses that are available on your account and you can choose to whitelabel a single IP address that currently does not have a whitelabel setup. - -From here, you can see which subusers have access to send from each of these IPs as well as where the current reverse DNS (rDNS) points. Once whitelabeled and verified, the rDNS should point to your IP whitelabel subdomain. - -{% anchor h3 %} -Subdomain -{% endanchor %} - -This is the “prefix” of the domain that you are actually whitelabeling. - -{% info %} -We suggest that you use the same subdomain as your domain whitelabel. -{% endinfo %} - -We will then prepend a second level subdomain similar to ```o1``` incrementing the numeric value of this string as you add IP whitelabels to this subdomain. - -{% anchor h3 %} -Domain -{% endanchor %} - -The root domain for your subdomain. This is the domain that will receive the email reputation from the whitelabel. Your root domain should match your FROM email address. If you are sending from newsletter@example.com, then you should whitelabel example.com so the domains match. - -{% anchor h3 %} -Use New Domain -{% endanchor %} - -Allows you to add a new domain to your whitelabel options. - -{% anchor h3 %} -Default IP Whitelabel -{% endanchor %} - -There is no default IP whitelabel. If you only have a single IP address, this will be the only IP address that SendGrid sends from on your behalf. - -{% anchor h2 %} -Creating an IP Whitelabel -{% endanchor %} - -When you enter the information for your IP whitelabel and click “Save”, SendGrid will update its own internal DNS to prepare for your whitelabel settings. This process may take up to 60 seconds. - -We will then give you the DNS A record entry that you need to enter at your host or registrar to match the new IP address. - -{% anchor h2 %} -Validate Your IP Whitelabel -{% endanchor %} - -{% warning %} -Your IP whitelabel will not work properly until the A record is propagated and validated by SendGrid. -{% endwarning %} - -Once you have made the DNS changes, you need to validate your whitelabel: - -1. Return to IP whitelabels -2. Click the whitelabel you just added (or the gear icon to the right of the whitelabel) -3. Click “Validate” - -If everything is set up properly and the DNS records have propagated, then SendGrid will verify your whitelabel. - -{% anchor h3 %} -Viewing Your IP Whitelabel -{% endanchor %} - -If you need to check the status of a whitelabel, you can see the “at a glance” information from the IP Whitelabel page. However, if you’re looking for more in-depth information or you need to find the DNS settings for your whitelabel then just click the gear icon next to the whitelabel and select “View.” - -From this page you will be able to see all of the settings you entered when setting up your whitelabel, whether the whitelabel is valid, and all of the DNS settings you need for this whitelabel. - -{% anchor h3 %} -Adding An IP To Your Account -{% endanchor %} - -When you add an IP address to your SendGrid account then you will likely want to add a whitelabel for this IP address. - -{% anchor h2 %} -Deleting an IP Whitelabel -{% endanchor %} - -{% warning %} -Deleting an IP whitelabel is permanent and can not be rolled back. -{% endwarning %} - -When you view your detailed whitelabel information, you will notice at the bottom of the page that you can delete this whitelabel. If you click the button and then confirm that you are sure you want to delete this whitelabel, then SendGrid will delete it. - -{% anchor h2 %} -Using the API -{% endanchor %} - -[Manage your IP whitelabel via our v3 API]({{root_url}}/API_Reference/Web_API_v3/Whitelabel/ips.html) diff --git a/source/User_Guide/Settings/Whitelabel/links.md b/source/User_Guide/Settings/Whitelabel/links.md deleted file mode 100644 index ae845d56e7..0000000000 --- a/source/User_Guide/Settings/Whitelabel/links.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -layout: page -weight: 0 -title: Links -seo: - title: Link Whitelabeling - description: Whitelabel click tracking links within SendGrid emails. - keywords: whitelabel, links, whitelabel link domains -navigation: - show: true ---- - - - -Email link whitelabels allow all of the click-tracked links to be from your domain instead of sendgrid.net. It also will serve open tracking images from your domain. This helps in email deliverability because you are no longer relying on clicktracking being routed through a domain that you do not control. Spam filters and recipient servers will look at the links within emails to determine whether the email should be delivered and will use the reputation of the root domain to determine whether the links can be trusted. - -{% anchor h2 %} -Email Link Whitelabel Settings -{% endanchor %} - -{% anchor h3 %} -On Behalf Of User -{% endanchor %} - -This setting lets you assign a whitelabel to a subuser account or the account you are currently using. A subuser can set up their own whitelabel, however, if the parent account assigns a whitelabel to a subuser, that subuser will not be able to edit or modify the settings of the assigned whitelabel. - -{% anchor h3 %} -Subdomain -{% endanchor %} - -This is the “prefix” of the root domain that you are actually whitelabeling. Historically, we have suggested prefixes like “link,” “click,” etc. However, you can use whatever subdomain you would like to use. - -{% warning %} -The email link whitelabel subdomain MUST be different from your domain whitelabel subdomain. -{% endwarning %} - -Even though your link whitelabel and domain whitelabel are different subdomains, the reputation of your root domain and your IP are what recipient servers and spam filters look at to determine whether your email is delivered. - -{% anchor h3 %} -Domain -{% endanchor %} - -{% warning %} -If you add a new default email link whitelabel for a email link domain that is already whitelabeled on your account, you risk invalidating and removing the default status of the previously set up email link whitelabel. -{% endwarning %} - -{% info %} -Your email link whitelabel will not affect your domain whitelabel and vice versa. -{% endinfo %} - -The root domain for your subdomain. This is the domain that will receive the reputation from the whitelabel. Your root domain should match your FROM email address. If you are sending from newsletter@example.com, then you should whitelabel example.com so the domains match. - -{% anchor h3 %} -Use new Domain -{% endanchor %} - -Allows you to add a new domain to your whitelabel options. - -{% anchor h3 %} -Default Whitelabel -{% endanchor %} - -{% info %} -There can be only one! -{% endinfo %} - -Your default whitelabel is your fallback for click and open tracking when you send emails. It will be used for all sending on your account, unless you have multiple valid whitelabels and one of them matches your FROM email domain. If there is no valid whitelabel match to your FROM email domain, then your whitelabel will fall back to your default domain whitelabel. For more information see the [Whitelabel Application Logic]({{root_url}}/User_Guide/Settings/Whitelabel/index.html#-Whitelabel-Application-Logic). - -{% anchor h2 %} -Creating An Email Link Whitelabel -{% endanchor %} - -When you enter the information for your whitelabel and click “Save,” we will show you the DNS entries that you need to make to match the settings you provided. - -{% info %} -You may create up to a maximum of 1500 link whitelabels. -{% endinfo %} - -{% anchor h2 %} -Validate Your Email Link Whitelabel -{% endanchor %} - -{% warning %} -SendGrid will not start using your whitelabels until they are validated! Until they are validated, you will see that all your links point to click track urls on sendgrid.net. -{% endwarning %} - -Once you have made the DNS changes, you need to validate your whitelabel: - -1. Return to the Email Link Whitelabels page -2. Click the whitelabel you just added (or the gear icon to the right of the whitelabel) -3. Click “Validate” - -If everything is setup properly and the DNS records have propagated, then SendGrid will verify your whitelabel and email sending will use this whitelabel following the [Whitelabel Application Logic]({{root_url}}/User_Guide/Settings/Whitelabel/index.html#-Whitelabel-Application-Logic). - -{% anchor h2 %} -Managing and Viewing Your Email Link Whitelabel -{% endanchor %} - -If you need to check the status of a whitelabel, you can see the “at a glance” information from the Email Link Whitelabel page. However, if you’re looking for more in-depth information or you need to find the DNS settings for your whitelabel then just click the gear icon next to the whitelabel and select "View." - -From this page you will be able to see all of the settings you entered when setting up your whitelabel, whether the whitelabel is valid, and all of the DNS settings you need for this whitelabel. - -{% anchor h2 %} -Deleting an Email Link Whitelabel -{% endanchor %} - -{% warning %} -Deleting an Email Link Whitelabel is permanent and can not be rolled back. -{% endwarning %} - -When you view your detailed whitelabel information, you will notice at the bottom of the page that you can delete this whitelabel. If you click the button and then confirm that you are sure you want to delete this whitelabel, then SendGrid will delete it. - -Once deleted, you will need to update your DNS as your links will no longer be white labeled to this subdomain by SendGrid. - -{% anchor h2 %} -Using the API -{% endanchor %} - -[Manage your link whitelabel via our v3 API]({{root_url}}/API_Reference/Web_API_v3/Whitelabel/links.html) diff --git a/source/User_Guide/Settings/account.md b/source/User_Guide/Settings/account.md index f7e0387717..70980898d2 100644 --- a/source/User_Guide/Settings/account.md +++ b/source/User_Guide/Settings/account.md @@ -1,24 +1,24 @@ --- layout: page weight: 0 -title: Account Settings +title: Account Details seo: - title: Account Settings + title: Account Details description: Manage your SendGrid account settings - keywords: account settings, profile settings + keywords: account settings, profile settings, account details navigation: show: true --- Your profile provides SendGrid with the information we need to contact you with alerts and notifications as well as send and track your emails. Each section of your profile can be edited by clicking the “Edit” button to the right of each section. Once you have made your changes, click the “Save” button. This will only save the settings for that section. If you decide to abandon your changes, click “Cancel.” -To edit your name and email address, click the “Change Contact Info” button to the right. A form will appear which will allow you to change these settings. +To edit your name and email address, click the “Change Contact Info” button to the right. A form will appear which will allow you to change these details. **First Name** - This is be the first name of the representative from your company who should receive contacts from SendGrid. **Last Name** - This is be the last name of the representative from your company who should receive contacts from SendGrid. -**Email address** - This is the address where you will be contacted by SendGrid for any account-level alerts and notifications. This must be a valid and active email address that you routinely check. +**Email address** - This is the address where you will be contacted by SendGrid for any account-level alerts and notifications such as billing notifications. This must be a valid and active email address that you routinely check. **Username** - Your SendGrid Username is used to access our API and our SMTP Relay. Changing this will immediately cause all of your calls to SendGrid to stop working. @@ -42,36 +42,8 @@ To edit your name and email address, click the “Change Contact Info” button If you find that your scheduled sends or stats seem like they are not quite correct, please double check your timezone. {% endinfo %} -**Timezone** - The [timezone]({{root_url}}/Glossary/timezone.html) in which your company operates. This setting will be used by other SendGrid functionality such as [Statistics]({{root_url}}/User_Guide/Settings/index.html) and scheduling sends in [Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/campaigns.html). Please make sure that your timezone is set to the same as your business. +**Timezone** - The [timezone]({{root_url}}/Glossary/timezone.html) in which your company operates. This setting will be used by other SendGrid functionality such as [Statistics]({{root_url}}/User_Guide/Statistics/index.html) and scheduling sends in [Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/campaigns.html). Please make sure that your timezone is set to the same as your business. **Website** - Your company’s website **Phone** - Your company’s phone number, where SendGrid can reach the representative that should be contacted. - -**Billing Email** - If this email is added, SendGrid will send all your billing notifications to this address. If you do not specify this address, SendGrid will send your billing notifications to your account email. - -{% anchor h2 %} -Changing Your Password -{% endanchor %} - -There are two ways to change your password. Through the SendGrid UI and through the Forgot Password page. - -{% warning %} -When you change your account password, your SMTP and API access will change as well. Make sure you update your account information on all systems and software! -{% endwarning %} - -{% anchor h3 %} -Changing your Password through the SendGrid UI -{% endanchor %} - -**Current Password** - This is the current password on your account. Without this, you will not be able to change your password. - -**New Password** - Enter a new password into this field. Passwords should be secure and not guessable so as to protect your account information from nefarious people and scripts.. - -**Confirm New Password** - Enter the same password that you put into “New Password.” If the password entered here is not the same as what you put into “New Password,” the form will not accept your new password. - -{% anchor h3 %} -Changing your Password via Forgot Password -{% endanchor %} - -If for some reason you cannot remember your password, go to the [SendGrid login page]({{site.site_url}}/login) and click ”[Forgot Password]({{site.site_url}}/user/forgotPassword)." From here, you will need to enter your SendGrid username. We will send you an email with account reactivation steps, please follow these steps to access your account again. diff --git a/source/User_Guide/Settings/alerts.md b/source/User_Guide/Settings/alerts.md index e59978d15f..ee42db5703 100644 --- a/source/User_Guide/Settings/alerts.md +++ b/source/User_Guide/Settings/alerts.md @@ -43,6 +43,6 @@ Stats Notifications An email containing your stats sent at the frequency you define. For example: Weekly stats will be sent once week and show the trailing week. -Daily Stats will be sent every day, but with trailing 7 day stats included. +Daily Stats will be sent every day, but with trailing 7 day stats included. For more in depth statistics, we suggest using the [Event Webhook]({{root_url}}/API_Reference/Webhooks/event.html). diff --git a/source/User_Guide/Settings/api_keys.md b/source/User_Guide/Settings/api_keys.md index 7034a0ab98..2168e9e6f2 100644 --- a/source/User_Guide/Settings/api_keys.md +++ b/source/User_Guide/Settings/api_keys.md @@ -14,27 +14,29 @@ navigation: Table of Contents {% endanchor %} -* [What are API Keys?](#-What-are-API-Keys) -* [Create an API Key](#-Create-an-API-Key) -* [API Key Permissions](#-API-Key-Permissions) -* [Edit an API Key](#-Edit-an-API-Key) -* [Inactivate an API Key](#-Inactivate-an-API-Key) -* [Sending Email With an API Key](#-Sending-Email-With-an-API-Key) +* [What are API keys?](#-What-are-API-keys) +* [Creating an API key](#-Creating-an-API-key) +* [API key permissions](#-API-key-permissions) +* [Replacing an old API key with a new one](#-Replacing-an-old-API-key-with-a-new-one) +* [Edit an API key](#-Edit-an-API-key) +* [Testing an API key](#-Testing-an-API-key) +* [Inactivate an API Key](#-Inactivate-an-API-key) {% anchor h2 %} -What are API Keys? +What are API keys? {% endanchor %} API keys are used by your application, mail client, or website to authenticate access to SendGrid services. They are the preferred alternative to using a username and password because you can revoke an API key at any time without having to change your username and password. We suggest that you use API keys for connecting to all of SendGrid’s services. There are two different types of API keys: -1. **Billing API Keys** are used only to authenticate billing related API calls. -2. **General API Keys** are used to authenticate all other API calls. +1. **Full Access** gives all of the API methods. +1. **Restricted Access** lets you customize the level of access. +1. **Billing Access** gives you access to the billing endpoints. We require that you create a separate API key for making billing related API calls. This segmentation adds an extra level of security by giving you more control over who has access to the various areas of your account. -You may also assign an API key specific permissions that further restrict which API calls it is capable of authenticating. For more detailed information about API key permissions, please visit our [Classroom]({{root_url}}/Classroom/Basics/API/api_key_permissions.html). +For more detailed information about API key permissions, see our [API Keys permissions page]({{root_url}}/Classroom/Basics/API/api_key_permissions.html). When viewing the API keys page, you will see a list of your current API keys along with the following information: @@ -44,20 +46,27 @@ When viewing the API keys page, you will see a list of your current API keys alo **Action** - Actions you can perform on your API keys, such as editing or deleting the key. +{% info %} There is a limit of 100 API Keys per account. {% endinfo %} + {% anchor h2 %} -Create an API Key +Creating an API key {% endanchor %} -When you click the “Create API Key” button, a dropdown menu will appear allowing you to choose the type of API key you would like to create. After selecting either "General API Key" or "Billing API Key", you will be shown a page allowing you to give your new key a name and permissions. - -The API Key name will follow your API key around through the SendGrid UI, so it is important that you choose a name that is meaningful to you. +1. Go to the API Keys page in the SendGrid UI, and click `Create API Key`. +1. Give your API key a name. +1. Select **Full Access**, **Restricted Access**, or **Billing Access**. +1. If you're selecting **Restricted Access**, or **Billing Access**, select the specific permissions to give each category. For more information, see [API key permissions](#-API-key-permissions). +1. Click `Create a Key`. +1. Copy your API Key somewhere safe. For security reasons, do not put it directly in your code, or commit it somewhere like Github. {% warning %} -You will only be shown your API key one time. Please store it somewhere safe as we will not be able to retrieve or restore this generated token. +You will only be shown your API key one time. Please store it somewhere safe as we will not be able to retrieve or restore it. {% endwarning %} +{% info %} There is a limit of 100 API Keys per account. {% endinfo %} + {% anchor h3 %} -API Key Permissions +API key permissions {% endanchor %} During the API key creation process, you will be given the option of selecting specific permissions, or scopes, that you would like to assign to your new API key. These permissions restrict which areas of your account your API key will be able to access. @@ -72,13 +81,35 @@ When assigning permissions to your API key, you will be given the option to sele You may not give an API key greater permissions than you currently have. {% endinfo %} -After you click the “Save” button, you will be shown your API key. This key will only be shown here, so copy it down! Once you leave this page, you will not be able to see this key again. +{% anchor h2 %} +Replacing an old API key with a new one +{% endanchor %} + +1. Locate the API key you would like to replace in your list of keys and select the action menu drop down at the right on the same row, then select **Delete API Key**. +1. Next, [create an API key](#-Creating-an-API-key). +1. Replace the old API key with the new one in your code. + +{% anchor h2 %} +Testing an API key +{% endanchor %} + +You can easily test your newly created API key using cURL: + +{%codeblock%} + curl -i --request POST \ + --url https://api.sendgrid.com/v3/mail/send \ + --header 'Authorization: Bearer YOUR_API_KEY_HERE' \ + --header 'Content-Type: application/json' \ + --data '{"personalizations": [{"to": [{"email": "recipient@example.com"}]}],"from": {"email": "sendeexampexample@example.com"},"subject": "Hello, World!","content": [{"type": "text/plain", "value": "Howdy!"}]}' +{%endcodeblock%} + +Look for a **202 Accepted** in the HTTP response headers. {% anchor h2 %} Edit an API Key {% endanchor %} -Click the gear icon in the same row as the key you would like to edit. From here you can delete a key, making it completely inactive, or you can edit your key’s name and permissions. +Click the action menu in the same row as the key you would like to edit. From here you can delete a key, making it completely inactive, or you can edit your key’s name and permissions. {% anchor h2 %} Inactivate an API Key @@ -88,10 +119,4 @@ Inactivate an API Key Once you delete a key, it can no longer be used to access SendGrid’s services. {% endwarning %} -Click the gear icon in the same row as the key you want to inactivate. Choose “Delete.” This will delete the key permanently, making it inactive. Any subsequent API calls using this deleted API key will be rejected by SendGrid. - -{% anchor h2 %} -Sending Email With an API Key -{% endanchor %} - -You will need an API key to send email with SendGrid, we have provided [basic instructions for how to send emails with our API Keys]({{root_url}}/Classroom/Send/How_Emails_Are_Sent/api_keys.html) in case you need them. +Click the action menu in the same row as the key you want to inactivate. Choose “Delete.” This will delete the key permanently, making it inactive. Any subsequent API calls using this deleted API key will be rejected by SendGrid. diff --git a/source/User_Guide/Settings/billing.md b/source/User_Guide/Settings/billing.md index 09d831ef9f..b30eb074b2 100644 --- a/source/User_Guide/Settings/billing.md +++ b/source/User_Guide/Settings/billing.md @@ -1,51 +1,127 @@ --- layout: page weight: 0 -title: Billing Settings +title: Billing seo: - title: Billing Settings + title: Billing description: Manage your SendGrid billing settings - keywords: billing settings + keywords: billing, contacts, email credits, refund, plans, cancel, upgrade, downgrade navigation: show: true --- -When you create or upgrade to a paid account, you will put a credit card in for automatic payments. This will allow SendGrid to make the recurring package charges for your account without having to notify you each month of the bill. SendGrid relies on a PCI-DSS compliant 3rd party billing provider to store, process, and manage payment card processing. +- [Invoices]() +- [Payment methods]() +- [Marketing Campaigns Contacts](#-Marketing-Campaigns-Contacts) +- [Billing frozen and billing warned]() +- [Email credits]() +- [Overages]() +- [Requesting a refund]() +- [Changing your plan]() +- [Cancel account]() + +You can update your plan and billing details on the [Plan & Billing Details page](https://app.sendgrid.com/settings/billing) in the UI. + +For more information about understanding your bill, see [Reading your invoice]({{root_url}}/User_Guide/Settings/reading_your_invoice.html). + +When you create or upgrade to a paid account, you add a credit card in for automatic payments. This will allow SendGrid to make the recurring package charges for your account without having to notify you each month of the bill. SendGrid relies on a PCI-DSS compliant 3rd party billing provider to store, process, and manage payment card processing. + +{% anchor h2 %} +Payment methods +{% endanchor %} + +Currently, the only methods of payment we accept are credit or check cards. We charge accounts on a monthly basis; we do not offer pre-payment, quarterly billing, or annual billing at this time. We don’t accept PayPal, wire transfer, checks, or any card requiring a PIN. + +You can update your card information, retry a failed payment, and export past invoices for your business on the [Plan & Billing Details page](https://app.sendgrid.com/settings/billing). It is also possible to change your package type and cancel your account from this page. {% anchor h2 %} -Billing Details +Marketing Campaigns Contacts {% endanchor %} -Your billing details show you what plan you have and how you will be billed by SendGrid. +Each email sent using the UI or API costs one credit - this counts towards your monthly plan volume, just like the messages you already send. In addition to this normal charge, if you are using Marketing Campaigns to store contacts, you are charged for storing those contacts: -**Plan** - The plan you are currently using with Sendgrid. +**Your first 2,000 contacts are free. After 2,000, we charge $10.00 per 10,000 stored contacts per month.** -**Price** - The price per month that you pay to use SendGrid. +We charge based on the highest number of contacts stored in the preceding month. Think of it as a high-water mark, so even if you reduce your contacts before your next bill rolls around (the 1st of each calendar month), we charge for whatever upper limit was reached. + +{% anchor h3 %} +Subusers +{% endanchor %} -**Overage Price** - The price you pay per email when you send more emails than are available on your package. +Each subuser may store up to 2,000 contacts for free before we charge the same rate of $10.00 per 10,000 contacts each month. Any additional charges due for storing contacts on a subuser account will appear in the parent account's monthly invoice. -**Marketing** - The cost per marketing email when using [Marketing Campaigns]({{root_url}}/User_Guide/Marketing_Campaigns/index.html). +{% info %} +We bill the parent account for each unique contact, regardless of how many lists or segments that contact appears on. However, if there are one or more subusers under a parent account, we bill the parent account for all unique contacts stored on each account, even for the same contacts stored on multiple accounts. +{% endinfo %} {% anchor h2 %} -Invoices +Billing frozen and billing warned {% endanchor %} -Your recent invoices are shown in this section in a list ordered by date. You are shown the date you were billed, how much you were billed, and the status of that invoice. +**Billing warned - “You have unpaid invoices. Please update your payment details or retry payment.”** + +This is a warning that your service may be interrupted unless you settle any outstanding balance on your account. This warning may occur if the card on file for your account gets declined when we attempt to process payment on the first of the month. + +Update your credit card or retry a payment by logging into your SendGrid account and visiting the [Plan & Billing Details page](https://app.sendgrid.com/settings/billing). You can then either re-enter the credit card information and then click **Save**, or retry the payment. If you choose to update the card on file, the outstanding payment processes automatically. + +**Billing Frozen** + +If you find your account suddenly unable to send mail within the first week of the month, your account could be in a billing frozen state. This state occurs when the card on file for your account gets declined when we attempted to process payment on the first of the month. + +To reactivate your account, please update your credit card on file by logging into the SendGrid UI and going to the [Plan & Billing Details page](https://app.sendgrid.com/settings/billing). You can then change or re-enter the card information and then click **Save**. Once you update the card on file, the payment will process automatically, and the account is unfrozen. {% anchor h2 %} -Changing Your Plan +Email credits {% endanchor %} -To change your plan, click the “Change Plan” button next to your billing details. You will be shown the plan options that are available to you, whether you are upgrading or downgrading your SendGrid service. Simply click the plan you would like and follow the prompts. +Every email processed by SendGrid uses an email credit. Free, Essentials, Pro, and Premier accounts will see their email credits reset the 1st day of each month at 12:01 PST. {% anchor h2 %} -Cancel Account +Overages {% endanchor %} +Depending on your package, you will be charged a small amount per-email for each email that you send beyond the credit limit of your current package. Any overage charges get added to the invoice of the month _after_ the over-limit sending occurred. + +{% info %} +Upgrading your account does NOT absorb overage charges already incurred, so make sure you are using the right package for your usage case. +{% endinfo %} + +{% anchor h2 %} +Requesting a refund +{% endanchor %} + +You must meet both criteria below for a refund to be considered: + +- You have not used your account in the current calendar month. +- You have no overages, and you have no contacts stored in Marketing Campaigns. + +SendGrid packages operate off of a monthly subscription model, not direct usage. We will not issue a refund if you have used your account in the same calendar month as your request. Instead please cancel your account to avoid any future subscription charges. + +Refunds are only applicable to the subscription charge on your account, not for overage or contact storage charges from the prior month. We hold our customers responsible for managing their account credit limits and contact storage. + +If you meet these conditions, please respond directly to the invoice email you have received, or email billing@sendgrid.com to begin the discussion about a possible refund. + +{% anchor h2 %} +Changing your plan +{% endanchor %} + +To change your plan, click **Change Plan** next to your [billing details](https://app.sendgrid.com/settings/billing). Select the plan you would like and follow the prompts. + +{% anchor h2 %} +Cancel your account +{% endanchor %} + +We are truly sorry to see you go. Please don’t forget that [we have 24/7 support]({{site.support_url}}) and would love the opportunity to help and chat about why you’re leaving if we can. + +To cancel, go the bottom of your billing details page, click **Cancel**, and follow the prompts. + {% info %} Canceled accounts are not deleted. Accounts are changed to our [free]({{site.site_url}}/free?mc=SendGrid%20Documentation) plan. {% endinfo %} -We are truly sorry to see you go. Please don’t forget that we have 24/7 support and would love the opportunity to help and chat about why you’re leaving if we can. +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} -To cancel, got the bottom of your billing details page, click the Cancel button, and follow the prompts. This process will close out your account. +- [SendGrid Pricing]({{site.site_url}}/pricing/) +- [Reading your invoice]({{root_url}}/User_Guide/Settings/reading_your_invoice.html) \ No newline at end of file diff --git a/source/User_Guide/Settings/cancel_account.md b/source/User_Guide/Settings/cancel_account.md new file mode 100644 index 0000000000..d3793c260e --- /dev/null +++ b/source/User_Guide/Settings/cancel_account.md @@ -0,0 +1,25 @@ +--- +layout: page +weight: 0 +title: Canceling your account +navigation: + show: true +seo: + title: Canceling your account + override: true + description: Steps for canceling your SendGrid account using the SendGrid UI + + +--- + +We’re sorry to see anyone leave, but things happen and we totally understand. + +*To cancel your SendGrid account:* + +1. Log into the SendGrid UI. +1. Select **Settings** and then click **Plan & Billing Details**. +1. At the bottom of the page, click **Cancel Account**. + +{% info %} +Cancellations take full effect on the first day of the next calendar month, at which point your account will still be usable, but will be at the Free package level. +{% endinfo %} \ No newline at end of file diff --git a/source/User_Guide/Settings/dedicated_ip_addresses.md b/source/User_Guide/Settings/dedicated_ip_addresses.md new file mode 100644 index 0000000000..8f31d787d0 --- /dev/null +++ b/source/User_Guide/Settings/dedicated_ip_addresses.md @@ -0,0 +1,128 @@ +--- +seo: + title: Dedicated IP Addresses + description: Dedicated IP Addresses + keywords: sendgrid ip address, ips, ip addresses, purchase IPs, add, additional, more, new, IP, address, purchase, dedicated, account, another, need, IPs, warmup, sending, originating, originate, plan, reputation, monitoring, monitor +title: Dedicated IP Addresses +weight: 0 +layout: page +navigation: + show: true +--- + +- [What are Dedicated IP Addresses?](#-What-are-Dedicated-IP-Addresses) +- [Why would I want a Dedicated IP Address?](#-Why-would-I-want-a-Dedicated-IP-Address) +- [Do I have a Dedicated IP Address?](#-Do-I-have-a-Dedicated-IP-Address) +- [How many Dedicated IPs should I have?](#-How-many-Dedicated-IPs-should-I-have) +- [Adding an additional Dedicated IP Address](#-Adding-an-additional-Dedicated-IP-Address) +- [Reputation Monitoring for Dedicated IP Accounts](#-Reputation-Monitoring-for-Dedicated-IP-Accounts) +- [Warming up a Dedicated IP Address](#-Warming-up-a-Dedicated-IP-Address) +- [Automatic IP Warmup Schedule](#-Automatic-IP-Warmup-Schedule) +- [Assigning a Dedicated IP address to a subuser](#-Assigning-a-Dedicated-IP-address-to-a-subuser) + +{% anchor h2 %} +What are Dedicated IP Addresses? +{% endanchor %} + +An Internet Protocol (IP) address is a unique numerical address that defines a location. At SendGrid, you can purchase IP addresses dedicated to your account. Since you are the only one sending email over this IP, the sender reputation associated with this IP is determined purely by your sending practices. + + +{% anchor h2 %} +Why would I want a Dedicated IP Address? +{% endanchor %} + +If you are sending any significant amount of email, we typically suggest sending your marketing and transactional emails to from separate IP addresses. In addition, it is strongly recommended to associate your sending domain with your new outbound IP address (provided to you by SendGrid). This is available at no extra cost and can be accomplished by [completing an rDNS setup for your dedicated IP (here's a video tutorial and documentation help)](https://sendgrid.com/docs/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html). + +We also suggest having at least two promotional IP addresses when your volume reaches 200-300K/month. + + +{% anchor h2 %} +Do I have a Dedicated IP Address? +{% endanchor %} + +Depending on the plan you have chosen, you either have a dedicated sending IP address or you are using a shared sending IP address. + +- All Pro and Premier customers are given at least one dedicated sending IP by default. You can view any IPs attached to your account [here](https://app.sendgrid.com/settings/ip_addresses). +- Free and Essential customers send from groups of shared IP addresses, where they are grouped with senders of similar reputation and deliverability. Shared IPs addresses that these accounts send from can change without notice as your reputation changes, or as we make changes to IP groups to improve deliverability. In theses cases, you will not be able to view your shared sending IP addresses from within your account. + + +{% anchor h2 %} +How many Dedicated IPs should I have? +{% endanchor %} + +Please see our document on [suggested IP allocation based on volume](https://sendgrid.com/docs/assets/IPWarmupSchedule.pdf). + + +{% anchor h2 %} +Adding an additional Dedicated IP Address +{% endanchor %} + +You can purchase an additional Dedicated IP Address from the IP Addresses Settings page or from your [Plan & Billing Details](https://app.sendgrid.com/settings/billing) page. + +*To add an additional Dedicated IP Address:* + +1. In the left navigation, select **Settings** and then click **IP Addresses**. + Here you'll see a list of your current Dedicated IPs. Your IPs in warmup will have a 'warmup' label +1. Click **Add an IP Address**. +1. Select the number of IP addresses you would like to purchase. + +Under "Additional Options" you will find the following options: + + * *Use automated IP warmup:* when checked, SendGrid will gradually increase the amount of email sent over this IP. Note: It is best practice to [warm an IP address]({{root_url}}/Classroom/Deliver/Delivery_Introduction/warming_up_ips.html) over time before sending fully over that IP address. When using automated warm up, you must have at least one other warm IP that can handle the overflow traffic from the IP in warmup. + * *Allow my parent account to send mail using these IP addresses:* check this if you want your parent account to be able to send over this IP. If you are assigning this IP to a subuser and only want that subuser to have permission to send on this IP, leave this box unchecked. + * *Allow my subusers to send mail using these IP addresses:* check this to select which subusers can send on this IP address + +After purchasing your IP, we strongly encourage you to set up reverse DNS. For more information about setting up reverse DNS, see [link text]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_reverse_dns.html). + +{% info %} Purchasing and adding dedicated IPs can only be performed by the Parent account, or Teammates with either Billing or Admin permissions. {% endinfo %} + +{% info %} Additional IPs cost an extra $30 per additional IP per month. You may only add up to 3 new IP addresses to your account per month. {% endinfo %} + + +{% anchor h2 %} +Reputation Monitoring for Dedicated IP Accounts +{% endanchor %} + +SendGrid does not offer dedicated IP address reputation monitoring as a service. We do not manage the reputation of your dedicated IP address since only your mail is being sent via your dedicated IP. This means that you have ultimate control over the content that is being sent out and therefore are responsible for monitoring and maintaining its reputation and listing status. However, there are many services that can help you maintain your IP’s reputation. + +The following are some third party tools available to assist you in maintaining your reputation: + +* [250ok](https://250ok.com/tools/blacklists/) +* [Return Path](https://returnpath.com/request-a-demo-social/?sfdc=701000000006Za6&gclid=CIO88sevkcwCFRSPfgod6u8AXA) +* [Sender Score](https://www.senderscore.org/blacklistlookup/) + +In addition, SendGrid does offer [Delivery Consultation](https://sendgrid.com/marketing/delivery-consult/) services to Pro and Premier accounts that can help with deliverability and on-boarding. Services include how to maintain/improve domain and IP reputation, reviewing message content, dedicated IP configuration, and creating a custom IP warm-up plan just to name a few. + +{% anchor h2 %} +Warming Up a Dedicated IP Address +{% endanchor %} + +For more information on warming up an IP Address, see [Warming up a dedicated IP]({{root_url}}/User_Guide/Settings/ip_warmup.html). + +{% anchor h2 %} +Assigning a Dedicated IP address to a subuser +{% endanchor %} + +Subusers cannot set up and add reverse DNS to their own dedicated IPs, but you can set it up for them and assign it to them. You can add a dedicated IP to a subuser when you [create the subuser]({{root_url}}/User_Guide/Settings/subusers.html#-Create-a-Subuser), or in the [Subuser management](https://app.sendgrid.com/settings/subusers) page. + +{% anchor h3 %} +Before you begin +{% endanchor %} + +You need to have a [subuser]({{root_url}}/User_Guide/Settings/subusers.html#-Create-a-Subuser), and a [dedicated IP address](https://sendgrid.com/docs/User_Guide/Settings/dedicated_ip_addresses.html#-Adding-an-additional-Dedicated-IP-Address) you want to assign the subuser. + +*To assign a Dedicated IP to a subuser after the subuser is already created:* + +1. Navigate to **Settings** and select [Subuser Management](https://app.sendgrid.com/settings/subusers). +1. Select the Subuser to assign the dedicated IP. +1. Select **Change Sending**. +1. Under I.P. Addresses, select an IP address to assign to the subuser. +1. Select **Save** + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Warming up a dedicated IP]({{root_url}}/User_Guide/Settings/ip_warmup.html) +- [API IP Access Management]({{root_url}}/User_Guide/Settings/ip_access_management.html) +- [SendGrid billing information]({{root_url}}/User_Guide/Settings/billing.html) diff --git a/source/User_Guide/Settings/index.html b/source/User_Guide/Settings/index.html deleted file mode 100644 index 7afb1ee3b3..0000000000 --- a/source/User_Guide/Settings/index.html +++ /dev/null @@ -1,51 +0,0 @@ ---- -layout: page -weight: 100 -title: Overview -seo: - title: Settings Overview - description: Manage your SendGrid settings - keywords: account settings, profile settings, mail settings, overview -navigation: - show: true ---- - -

    -SendGrid allows you to configure and control everything about your SendGrid account. All of the settings that you can manage through the User Interface can also be managed through the API v3. -

    - -

    Account Settings

    -

    Your basic account settings for username, password, email address, and business address details.

    - -

    Alert Settings

    -

    Receive alerts about your account and your SendGrid behavior via email.

    - -

    API Keys

    -

    Create and manage your API Keys, which allow you to use SendGrid from your application or website.

    - -

    Billing Settings

    -

    Manage your payment details, invoices, and package.

    - -

    Inbound Parse

    -

    Process incoming email with the Inbound Parse Webhook and POSTs parsed data to a URL that you choose.

    - -

    Mail Settings

    -

    Control how SendGrid filters and processes your emails as they go out to your recipients.

    - -

    MultiFactor Authentication

    -

    Restrict access to your SendGrid.com account using Multiple Factor Authentication.

    - -

    Teammates

    -

    Create and manage Teammates to give your employees and coworkers access to the same SendGrid.com account.

    - -

    Partner Settings

    -

    Control settings for SendGrid partner services.

    - -

    Subuser Settings

    -

    Create and manage subusers to segment your email sending and have different settings for your segments.

    - -

    Tracking Settings

    -

    Control how your emails and your recipient email interaction behaviors are tracked within SendGrid.

    - -

    Whitelabel Settings

    -

    Send all your emails from your domain and remove the "via SendGrid.net" message from your emails.

    diff --git a/source/User_Guide/Settings/ip_access_management.md b/source/User_Guide/Settings/ip_access_management.md index 420c80be07..85611ace01 100644 --- a/source/User_Guide/Settings/ip_access_management.md +++ b/source/User_Guide/Settings/ip_access_management.md @@ -14,7 +14,7 @@ navigation: What is IP Access Management? {% endanchor %} -[IP Access Management]({{root_url}}http://app.sendgrid.com/settings/access) is a security feature that allows you to control who can access your SendGrid account based on their [IP address]({{root_url}}/Glossary/ip_address.html). After you whitelist an IP address, you can only access the SendGrid UI, API, and SMTP relay if you are connecting from a whitelisted IP address. Any other access attempts will be blocked. This is a powerful security tool that you can use to help prevent malicious activity on your account. +[IP Access Management]({{root_url}}http://app.sendgrid.com/settings/access) is a security feature that allows you to control who can access your SendGrid account based on their [IP address]({{root_url}}/Glossary/ip_address.html). After you whitelist an IP address, you can only access the SendGrid UI, API, and SMTP relay if you are connecting from a whitelisted IP address. Any other access attempts will be blocked. This is a powerful security tool that you can use to help prevent malicious activity on your account. {% info %} There is no limit on how many IP addresses you can whitelist. diff --git a/source/User_Guide/Settings/ip_warmup.md b/source/User_Guide/Settings/ip_warmup.md new file mode 100644 index 0000000000..ac86e52099 --- /dev/null +++ b/source/User_Guide/Settings/ip_warmup.md @@ -0,0 +1,438 @@ +--- +seo: + title: Warming Up an IP Address + description: Learn how to warm up your new dedicated IP address and why it's important. + keywords: warm, up, warmup, auto, automatic, manual API, v3, ip, pool, warmup, pools +title: Warming Up an IP Address +weight: 0 +layout: page +navigation: + show: true +--- + + + +When you add a new dedicated IP address to your account, you need to warm it up. You also need to warm up your IP if you haven't sent on it in more than 30 days. [Warming up your IP]({{root_url}}/Glossary/ip_warmup.html) allows you to gradually send more emails over your new IP to establish a good [sender reputation]({{root_url}}/Classroom/Basics/Misc/your_reputation_what_is_it.html). + +- [What is warming up an IP?](#-What-is-warming-up-an-IP) +- [Warmup types](#-Warmup-types) + - [Manually warm up your IP](#-Manually-warm-up-your-IP) + - [Automated IP warmup](#-Automated-IP-warmup) + - [Automated IP warmup API](#-Automated-IP-warmup-API) + - [Automated IP warmup hourly send schedule](#-Automated-IP-warmup-hourly-send-schedule) + - [Why don't other ESPs require IP warmup?](#-Why-dont-other-ESPs-require-IP-warmup) + +{% anchor h2 %} +What is warming up an IP? +{% endanchor %} + +IP warming is the practice of gradually increasing the volume of mail sent with a dedicated IP address according to a predetermined schedule. This gradual process helps to establish a reputation with ISPs (Internet Service Providers) as a legitimate email sender. + +When an ISP observes email suddenly coming from a new or "cold" IP address, they will take notice and immediately begin evaluating the traffic coming from that IP. Since ISPs treat email volume as a key determining factor when detecting spam, it is best to begin sending a low to moderate volume, eventually working your way up to larger volumes. This gives the receiving email providers a chance to closely observe your sending habits and record how your recipients engage with your email. + +A gradual warm-up does not always guarantee a perfect sending reputation. It is still important to follow sending [best practices](https://sendgrid.com/blog/10-tips-to-keep-email-out-of-the-spam-folder/). + +{% info %} +It is much easier to establish a positive reputation as a new sender, than it is to repair an existing reputation. +{% endinfo %} + +{% anchor h2 %} +Warmup types +{% endanchor %} + +There are three ways to warm up your IP. If your dedicated IP is relatively new, or you've never had one before, you need to warm up your IP manually. If you are adding new dedicated IPs to existing warm IPs, you can automatically warm up your IP with the UI or the API. When your IP is being warmed up, this is your hourly sending limit: + +{% anchor h3 %} +Manually warm up your IP +{% endanchor %} + +To manually warm up your IP, you need to gradually send more and more email over your IP address at the rate in our suggested [IP Warmup Schedule]({{root_url}}/assets/IPWarmupSchedule.pdf). + +{% anchor h3 %} +Automated IP warmup +{% endanchor %} + +*To set up automated IP warmup in the UI:* + +1. Go to [Settings > IP Addresses](https://app.sendgrid.com/settings/ip_addresses). +1. Click the action menu for the IP you want to warm up. This brings up the **Edit Your Dedicated IP Address** screen. +1. Select **Use Automated IP warmup**. +1. Save the **Edit Your Dedicated IP Address** screen. + +{% anchor h3 %} +Automated IP warmup API +{% endanchor %} + +You can also put your IP address into warmup mode with our [Automated Warmup API]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup.html) - this automatically throttles traffic sent through your new IP according to our [warm up schedule]({{root_url}}/API_Reference/Web_API_v3/IP_Management/ip_warmup_schedule.html). + +{% warning %} +When automatically warming up an IP, SendGrid limits the amount of email sent through that IP per hour. Any email requests that exceed this hourly limit will overflow to any other existing warm IPs on your account. If you do not have any other warm IPs, you should [warm up your IP manually](#-Manually-warm-up-your-IP). +{% endwarning %} + +{% anchor h3 %} +Automated IP warmup hourly send schedule +{% endanchor %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Warmup Age (Days) + + Hourly Email Limit +
    + 0 + + 20 +
    + 1 + + 28 +
    + 2 + + 39 +
    + 3 + + 55 +
    + 4 + + 77 +
    + 5 + + 108 +
    + 6 + + 151 +
    + 7 + + 211 +
    + 8 + + 295 +
    + 9 + + 413 +
    + 10 + + 579 +
    + 11 + + 810 +
    + 12 + + 1,000 +
    + 13 + + 1,587 +
    + 14 + + 2,222 +
    + 15 + + 3,111 +
    + 16 + + 4,356 +
    + 17 + + 6,098 +
    + 18 + + 8,583 +
    + 19 + + 11,953 +
    + 20 + + 16,734 +
    + 21 + + 23,427 +
    + 22 + + 32,798 +
    + 23 + + 45,917 +
    + 24 + + 64,284 +
    + 25 + + 89,998 +
    + 26 + + 125,997 +
    + 27 + + 176,395 +
    + 28 + + 246,953 +
    + 29 + + 345,735 +
    + 30 + + 484,029 +
    + 31 + + 677,640 +
    + 32 + + 948,696 +
    + 33 + + 1,328,175 +
    + 34 + + 1,859,444 +
    + 35 + + 2,603,222 +
    + 36 + + 3,644,511 +
    + 37 + + 5,102,316 +
    + 38 + + 7,143,242 +
    + 39 + + 10,000,539 +
    + 40 + + 14,000,754 +
    + 41 + + 19,601,056 +
    + + +{% anchor h2 %} +Why don't other ESPs require IP warmup? +{% endanchor %} + +Many other email service providers do not offer dedicated IP addresses to their customers - they place all of their customers on shared IP groups by default. Warming up is not required for a shared IP group - SendGrid handles this automatically. + +Having a dedicated IP allows you to control your own reputation completely, and prevents your sending from being impacted by the reputations of other SendGrid users. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Adding a dedicated IP]({{root_url}}/User_Guide/Settings/dedicated_ip_addresses.html) +- [API IP Access Management]({{root_url}}/User_Guide/Settings/ip_access_management.html) +- [SendGrid billing information]({{root_url}}/User_Guide/Settings/billing.html) diff --git a/source/User_Guide/Settings/ips.md b/source/User_Guide/Settings/ips.md deleted file mode 100644 index a14fc07b7a..0000000000 --- a/source/User_Guide/Settings/ips.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -seo: - title: Purchasing Dedicated IP Addresses - description: Purchase dedicated IP addresses - keywords: sendgrid ip address, ips, ip addresses, purchase IPs -title: Purchase IP Addresses -weight: 0 -layout: page -navigation: - show: true ---- - -{% anchor h2 %} -Setup/Configuration -{% endanchor %} - -You can purchase a dedicated IP address from the IP Addresses Settings page or from your Plan & Billing Details page. - -To purchase a dedicated IP: - -* Navigate to Settings in the left hand navigation menu, select IP Addresses -* Here you'll see a list of your current dedicated IPs. Your IPs in warmup will have a 'warmup' label -* Click 'Add an IP Address' -* Select the number of IP addresses you would like to purchase. - -Under "Additional Options" you will find the following options: - - * *Use automated IP warmup:* when checked, SendGrid will gradually increase the amount of email sent over this IP. Note: It is best practice to [warm an IP address]({{root_url}}/Classroom/Deliver/Delivery_Introduction/warming_up_ips.html) over time before sending fully over that IP address. When using automated warm up, you must have at least one other warm IP that can handle the overflow traffic from the IP in warmup. - * *Allow my parent account to send mail using these IP addresses:* check this if you want your parent account to be able to send over this IP. If you are assigning this IP to a subuser and only want that subuser to have permission to send on this IP, leave this box unchecked. - * *Allow my subusers to send mail using these IP addresses:* check this to select which subusers can send on this IP address - -After purchasing your IP, we strongly encourage you to whitelabel it. [Click here for a step-by-step tutorial explaining how to whitelabel your new IP address.]({{root_url}}/Classroom/Basics/Whitelabel/setup_ip_whitelabel.html) - -{% anchor h2 %} -Frequently Asked Questions -{% endanchor %} - -{% anchor h3 %} -What are dedicated IP addresses? -{% endanchor %} - -An Internet Protocol (IP) address is a unique numerical address that defines a location. At SendGrid, you can purchase IP addresses that dedicated to your account. Since you are the only one sending email over this IP, the sender reputation associated with this IP is determined purely by your sending practices. - -{% anchor h3 %} -Why would I want to buy my own IP address? -{% endanchor %} - -If you are sending any significant amount of email, we typically suggest sending your marketing and transactional emails to from separate IP addresses. You can learn more from our comprehensive blog post on [whitelabeling and subusers best practices](https://sendgrid.com/blog/whitelabeling-and-subusers-best-practices/). - -We also suggest having at least two promotional IP addresses when your volume reaches 200-300K/month. - -{% anchor h3 %} -How many IPs should I have? -{% endanchor %} - -Please see our document on [suggested IP allocation based on volume](https://sendgrid.com/docs/assets/IPWarmupSchedule.pdf). - -{% anchor h3 %} -Can I purchase an IP from any pricing plan? -{% endanchor %} - -This feature is only available for [Pro plans and higher](https://sendgrid.com/pricing). - -{% anchor h3 %} -How is my account's pricing affected by this feature? -{% endanchor %} - -For Pro plans, your first IP address is included in your plan's pricing. Each additional IP address is $30/month. - -{% anchor h3 %} -Are there limitations on usage? -{% endanchor %} - -You may purchase up to 3 IP addresses per month. If you need more than 3 IPs, then you should [contact support](https://support.sendgrid.com). - -{% anchor h3 %} -What if this is my first dedicated IP address? -{% endanchor %} - -If you have only 1 dedicated IP address, you will not be able to use automated warmup for this IP address. You will need to manually warm up the IP according to the schedule we recommend [here](https://sendgrid.com/docs/assets/IPWarmupSchedule.pdf). - -In order to use automated warmup, you must have at least one already warm IP so that overflow emails from your new IPs in warm up can be sent from an already warm IP. diff --git a/source/User_Guide/Settings/mail.md b/source/User_Guide/Settings/mail.md index c51fabcc3a..971b72c02c 100644 --- a/source/User_Guide/Settings/mail.md +++ b/source/User_Guide/Settings/mail.md @@ -130,9 +130,9 @@ Activating this setting allows you to specify an email address to which spam rep Forwarding abuse@ and postmaster@ Emails {% endanchor %} -The email address specified in the Forward Spam mail setting may also be used to receive emails sent to abuse@ and postmaster@ role addresses if you have [properly configured your domain whitelabel]({{root_url}}/Classroom/Basics/Whitelabel/setup_domain_whitelabel.html). +The email address specified in the Forward Spam mail setting may also be used to receive emails sent to abuse@ and postmaster@ role addresses if you have [authenticated your domain]({{root_url}}/User_Guide/Settings/Sender_authentication/How_to_set_up_domain_authentication.html). -For example, if you create a valid domain whitelabel using the subdomain `sub` and root domain `example` *and* have turned on Forward Spam, any emails sent to abuse@sub.example.com or postmaster@sub.example.com will be forwarded to the email address you entered in the Forward Spam mail setting. +For example, if you create a valid authenticated domain with a custom return path of `sub` and a root domain `example` *and* have turned on Forward Spam, any emails sent to abuse@sub.example.com or postmaster@sub.example.com will be forwarded to the email address you entered in the Forward Spam mail setting. {% anchor h3 %} Settings @@ -186,7 +186,7 @@ The Spam Checker setting, is useful when your web application allows your end us The default threshold is 5.0 and can range between 1 and 10. The lower the number, the more strict the filtering. For example, a value of 2 will drop all but the most flawless emails, whereas 9 will only drop the spammiest of spam emails. {% endwarning %} -We use [SpamAssassin](http://spamassassin.apache.org/full/3.4.x/doc/Mail_SpamAssassin_Conf.html#scoring_options) to process the spam checks for this filter. The default threshold is 5.0, but you can set this to any value between 1 and 10. You must provide an URL, so we will post the message to that URL. If a message is flagged as spam using this filter, it will automatically be dropped by our system and will not be delivered to the recipient. +We use [SpamAssassin](http://spamassassin.apache.org/full/3.4.x/doc/Mail_SpamAssassin_Conf.html#scoring_options) to process the spam checks for this filter. The default threshold is 5.0, but you can set this to any value between 1 and 10. You must provide a URL, so we will post the message to that URL. If a message is flagged as spam using this filter, it will automatically be dropped by our system and will not be delivered to the recipient. {% anchor h3 %} Settings diff --git a/source/User_Guide/Settings/parse.md b/source/User_Guide/Settings/parse.md index 4cac1fd968..3f7b882d63 100644 --- a/source/User_Guide/Settings/parse.md +++ b/source/User_Guide/Settings/parse.md @@ -26,11 +26,11 @@ The Inbound Parse Webhook requires a hostname, where the emails will be sent, an **Host Name** - The domain where you have pointed an MX Record so addresses at this hostname can receive email. For example: parse.yourdomain.com -When entering your host name (also referred to as the receiving domain), the subdomain-domain combination must be globally unique, and the domain must be one of your whitelabled domains. +When entering your host name (also referred to as the receiving domain), the subdomain-domain combination must be globally unique, and the domain must be one of your whitelabeled domains. **URL** - The URL for the Inbound Parse Webhook to POST all parsed email information. -**Spam Check** - Inbound Parse will check incoming emails for spam and reject the emails that are obviously spam. Selecting this option will also include a spam report. +**Spam Check** - Inbound Parse will check incoming emails for spam, then assign them a spam score and report. This will be reflected under `spam_score` and `spam_report` in your Parse Webhook post. The user can then determine how this score is interpreted and the severity. **Send Raw** - Select this option if you would prefer to receive the full MIME message. diff --git a/source/User_Guide/Settings/reading_your_invoice.md b/source/User_Guide/Settings/reading_your_invoice.md new file mode 100644 index 0000000000..0a281832ea --- /dev/null +++ b/source/User_Guide/Settings/reading_your_invoice.md @@ -0,0 +1,136 @@ +--- +seo: + title: Reading your invoice + description: Reading your invoice + keywords: invoice, bill, receipt, refund, line, item, marketing, campaigns, charge, contacts, usage, overage +title: Reading your invoice +weight: 0 +layout: page +navigation: + show: true +--- + +Your SendGrid invoice contains a lot of information which may be difficult to read. To see your invoice, check your email or visit your [Plan & Billing details](https://app.sendgrid.com/settings/billing) page. Here's information on how to read your invoice: + +![A screen shot of an example invoice]({{root_url}}/img/invoice_legend.jpg) + +{% anchor h2 %} +1. Physical Address +{% endanchor %} + +**The physical address of your business.** This address is the same address you entered when you first signed up. If you would like to update the address as it appears on your invoices, click Change Invoice Address on the [Plan & Billing Details](https://app.sendgrid.com/settings/billing) page. If you need to change the address on an existing invoice, please send an email to [billing@sendgrid.com](mailto:billing@sendgrid.com). + +{% anchor h2 %} +2. Billing Email +{% endanchor %} + +**The email address where you receive SendGrid statements**. By default, this is the primary email address on file in your account. + +Need to send invoices to multiple addresses? Consider creating a [role address](https://sendgrid.com/docs/Classroom/Deliver/Address_Lists/role_addresses.html) on your side that includes the all of billing stakeholders in your organization, or send an email to [billing@sendgrid.com](mailto:billing@sendgrid.com). + +{% anchor h2 %} +3. Charge Summary +{% endanchor %} + +The Charge Summary section breaks down your invoice total into individual charges. Some charges covered by this invoice are retroactive, meaning you are paying for usage in the previous month, while others are proactive, meaning you are paying for services for the upcoming month. This information is broken down in the **Service Period** column. + +{% anchor h3 %} +Plan +{% endanchor h3 %} + +![Charge summary section]({{root_url}}/img/invoice_plan.jpg) + +This is the **plan you subscribe to**. In this case, the user is on a Pro 100K plan and will be charged $79.95 to use it for the month of July. + +{% anchor h3 %} +IP Address +{% endanchor h3 %} + +![Additional IP address section]({{root_url}}/img/invoice_IP_address.jpg) + +These charges indicate that you have **additional Dedicated IP Addresses** allocated to your account. There are two lines in this example because one IP Address was added before the IP Address price increased, and the other was added after. The user in this example will pay $80.00 total for their IPs for the month of July (1 IP at $20, 2 IPs at $30). + +Additional IPs cost $30.00/mo each and are available on Pro 100K plans and above. + +For more information on SendGrid Plans, visit our [pricing page](https://sendgrid.com/pricing). + +{% anchor h3 %} +Contact List Storage +{% endanchor h3 %} + +![Contact storage section]({{root_url}}/img/invoice_contact_1.jpg) + +This item is the charge for the highest number of **contacts stored in Marketing Campaigns during the previous month**. + +Refer to "Contact List Usage" in the Usage Summary section below for more information on how this charge is calculated. + +{% anchor h3 %} +Email Activity History +{% endanchor h3 %} + +![Email activity section]({{root_url}}/img/invoice_ease.jpg) + +This charge is for access to the **Email Activity Feed API** as well as **30 days worth of Email Activity History** in the app. These two features are sold as a package and cannot be added individually. + +The price for access to this feature varies per plan. For more information on pricing for Email Activity History, visit our [pricing page](https://sendgrid.com/pricing). + +{% anchor h3 %} +Tax +{% endanchor h3 %} + +![Tax summary section]({{root_url}}/img/invoice_tax.jpg) + +If you are in [a jurisdiction where SendGrid is required to charge sales tax]({{root_url}}/User_Guide/Settings/taxes_and_tax_exempt.html), your **tax charges** will appear here. + +{% anchor h2 %} +4. Usage Summary +{% endanchor %} + +The Usage Summary section outlines usage-based charges on your account **during the previous month**. + +{% anchor h3 %} +Plan Overage +{% endanchor h3 %} + +![Overage charges section]({{root_url}}/img/invoice_overage.jpg) + +This item is a calculation of **any emails sent beyond the monthly limit** of your package **during the previous month**. + +In this example, the Pro 100K plan allows for 100,00 emails to be sent per month. We see that in the previous month, 120,000 emails were sent for a total of 20,000 emails over the limit. The overage rate for the Pro 100K plan is $0.00085 per extra email, which works out to a $17.00 overage charge (20,000 x .00085 = 17). + +{% anchor h3 %} +Contact List Usage +{% endanchor h3 %} + +![Highest number of stored Marketing Campaigns Contacts in the previous month.]({{root_url}}/img/invoice_contact_storage.jpg) + +This item refers to highest number of **stored Marketing Campaigns Contacts in the previous month**. For more detailed breakdown on how Contact Storage billing works in Marketing Campaigns, [click here]({{root_url}}/Classroom/Basics/Billing/how_does_billing_work_for_marketing_campaigns.html). + +In this example, the number under the "Used" column refers to the number of "blocks" of 10,000 contacts that were stored in the previous month. We see that the highest number of blocks stored in that month was 6, or 60,000 contacts. + +The charge for contact storage is **$10.00/mo for every 10,000 contacts (1 block)**, so this example works out to a $60.00 usage charge for contacts stored in the previous month. + +{% anchor h3 %} +Newsletter Usage +{% endanchor h3 %} + +![Empty Newsletter usage.]({{root_url}}/img/invoice_NL_usage.jpg) + +This item refers to usage of our **[Legacy Newsletter product]({{root_url}}/User_Guide/Legacy_Newsletter/index.html)**. We no longer offer this product, so most invoices will either not include this line item or will show a balance of $0.00, as in this example. + +{% anchor h2 %} +5. Transaction and Payment Summary +{% endanchor %} + +![Transaction and payment summary]({{root_url}}/img/invoice_payment_summary.jpg) + +The Transaction Summary shows the total charges for the month, and the Payment Summary shows the payment type and last 4 digits of the card that was charged. For more information about updating your payment method, [click here](https://sendgrid.com/docs/Classroom/Basics/Billing/update_your_credit_card_and_resubmit_payments.html). + +**These line items always reflect the plan you currently have, not necessarily "Pro 100K", which is shown for the purposes of demonstration**. + +{% anchor h3 %} +Additional Resources +{% endanchor h3 %} + +- [SendGrid Pricing]({{site.site_url}}/pricing/) +- [Billing]({{root_url}}/User_Guide/Settings/billing.html) diff --git a/source/User_Guide/Settings/reset_username_password.md b/source/User_Guide/Settings/reset_username_password.md new file mode 100644 index 0000000000..1437056eb6 --- /dev/null +++ b/source/User_Guide/Settings/reset_username_password.md @@ -0,0 +1,75 @@ +--- +layout: page +weight: 0 +title: Resetting your username and password +navigation: + show: true +seo: + title: Resetting your username and password + override: true + description: Steps for resetting your username and password using the SendGrid UI + + +--- + + + +- [Changing your password](#-Changing-your-password) + - [Changing your password through the SendGrid UI](#-Changing-your-password-through-the-SendGrid-UI) + - [Changing your password via Forgot Password](#-Changing-your-password-via-Forgot-Password) +- [Changing your username](#-Changing-your-username) + -[Resetting your username](#-Resetting-yourusername) + +{% anchor h2 %} +Changing your password +{% endanchor %} + +If you already know your password, you can change your SendGrid password by editing your [Account Details](https://app.sendgrid.com/settings/account) in the UI. If you've forgotten your password, you can reset it on the [Reset password page](https://app.sendgrid.com/forgot_password). + +{% warning %} +When you change your account password, your SMTP and API access will change as well. Make sure you update your account information on all systems and software. +{% endwarning %} + +{% anchor h3 %} +Changing your password through the SendGrid UI +{% endanchor %} + +*To change your password through the SendGrid UI:* + +1. From the homepage, select the drop-down in the top left corner and then select **Account Details** or navigate to **Settings** and then click **Account Details**. +1. Locate the *Username* and *Password* section and click **Edit**. +1. Enter your current password and a new password in the fields and then click **Save**. + +{% anchor h3 %} +Resetting your password +{% endanchor %} + +If for some reason you cannot remember your password and cannot log in, you can still change your password. + +*To reset your password using the Forgot Password link:* + +1. Navigate to the [SendGrid login page]({{site.site_url}}/login). +1. Click **[Forgot Password]({{site.site_url}}/user/forgotPassword)**. +1. Enter your SendGrid username. + +We will send you an email with account reactivation steps - follow these to access your account again. If you don't receive the email, you may not be entering the correct username. + +{% anchor h2 %} +Changing your username +{% endanchor %} + +*To change your username:* + +1. From the homepage, select the drop-down in the top left corner and then select **Account Details** or navigate to **Settings** and then click **Account Details**. +1. Click **Edit**. +1. Enter a new username and then click **Save**. + +{% warning %} +When you change your account username, your SMTP and API access will change as well. Make sure you update your account information on all systems and software. +{% endwarning %} + +{% anchor h3 %} +Resetting your username +{% endanchor %} + +In the event that you forget your username, you can reset it by filling out [this form](https://support.sendgrid.com/hc/en-us/requests/new#forgot-username). diff --git a/source/User_Guide/Settings/subusers.md b/source/User_Guide/Settings/subusers.md new file mode 100644 index 0000000000..1127d12dd6 --- /dev/null +++ b/source/User_Guide/Settings/subusers.md @@ -0,0 +1,180 @@ +--- +layout: page +weight: 0 +title: Subusers +seo: + title: Subusers + description: Create and Manage Subusers + keywords: Subuser settings, create Subuser, manage Subuser, delete Subuser +navigation: + show: true +--- + +{% info %} +If you have a **Pro plan or higher**, you may create up to 15 Subusers through your account. If you reach the maximum of 15 and require more Subusers, please use the form in the [Subuser Management]({{site.app_url}}/settings/Subusers) page to request more. +{% endinfo %} + +Subusers help you segment your email sending and API activity. You assign permissions and credit limits when you create the Subusers. We recommend creating Subusers for each of the different types of emails you send - so one Subuser for transactional emails, and another for marketing emails. Breaking your sending up this way allows you to get separate statistics for each type of email you send. + +- [Create a Subuser](#-Create-a-Subuser) +- [Manage Subusers](#-Manage-Subusers) +- [Optional Profile Information](#-Optional-Profile-Information) +- [Allocating or Removing Credits From a Subuser](#-Allocating-or-Removing-Credits-From-a-Subuser) +- [Monitoring Subuser email content](#-Monitoring-Subuser-email-content) +- [Impersonating a Subuser](#-Impersonating-a-Subuser) +- [Export Subuser Information](#-Export-Subuser-Information) +- [Disabling a Subuser account](#-Disabling-Subuser-account) +- [Deleting a Subuser account](#-Deleting-a-Subuser-account) + +{% anchor h2 %} +Create a Subuser +{% endanchor %} + +New SendGrid accounts do not come with Subusers and must be created by the parent account. + +*To create a Subuser:* + +1. Navigate to **Settings** and select **Subuser Management**. +1. Click **Create New Subuser**. +1. Enter the following required information into the corresponding fields: + * Username - The username your Subuser will use to send emails and access the API. + * Email Address - The contact email address for this Subuser. This must be an active email account as SendGrid may contact a Subuser to provide support, resolve sending and deliverability issues, or to enforce SendGrid's Terms of Service. Whenever we contact a Subuser, it is our policy to contact the parent account email address at the same time. + * Password - The password your Subuser will use to access SendGrid.com. + * Avatar - If you have [gravatar](http://gravatar.com), or globally recognized avatar, that you use for other applications, it is automatically associated with this Subuser when you enter an email address. This makes it easier to identify all of the Subusers attached to your account. + +1. Assign an IP Address to the Subuser account. + You are assigned a dedicated IP address when you create a Pro 100k plan or higher. If you send at a high volume, and you're using Subusers to separate out your sending traffic, it's best practice to purchase a separate IP for each sending type. + +{% anchor h2 %} +Manage Subusers +{% endanchor %} + +Subusers can be managed via [Subuser API](https://sendgrid.api-docs.io/v3.0/Subusers-api) or by using the SendGrid UI. + +*To manage a Subuser from the SendGrid UI:* + +1. Navigate to **Settings** and select **Subuser Management**. +1. Select the name of the Subuser. This takes you to the Subuser’s account and profile settings. From there, you can manage and update your Subuser Settings. + +{% anchor h2 %} +Optional Profile Information +{% endanchor %} + +We do not require this information for your Subusers, but we suggest that you fill out as much as possible to improve the deliverability for this Subuser, especially if the information does not match your parent account’s information. This will also allow SendGrid to contact your Subuser directly if we notice anything on their account. + +The following fields in the Subuser profile are optional: + +**First Name** - The first name of the person responsible for this Subuser. + +**Last Name** - The last name of the person responsible for this Subuser. + +**Company** - The name of your Subuser’s company. + +**Address 1** - The first line of your Subuser’s address. + +**Address 2** - The second line of your Subuser’s address. + +**City** - The city in which your Subuser operates. + +**State** - The state or province in which your Subuser operates. + +**Country** - The country in which your Subuser operates. + +**Zip** - The zip code in which your Subuser operates. + +**Company Phone Number** - The phone number for your Subuser’s business. + +**Company Website** - The website for your Subuser’s business. + +{% anchor h2 %} +Allocating or removing credits from a Subuser +{% endanchor %} + +{% warning %} +You can only allocate credits by selecting the nonrecurring credit option. +{% endwarning %} + +If your Subuser account has nonrecurring credits, you can allocate credits to, or remove credits from this Subuser account. On the Subuser's profile, click **Change Credit Rules** and then choose the appropriate credit amount for the Subuser. + +{% anchor h2 %} +Monitoring Subuser email content +{% endanchor %} + +This feature allows you to receive a sample of a Subuser's email content to help ensure that the content is not damaging your reputation. +{% warning %} +Each monitor email costs one email credit. +{% endwarning %} + +The “Collect Sample Rate” is the frequency is the number of emails SendGrid will allow through before copying the email address you set on the next email sent. For example, if you set the collect sample rate at 100 then you will receive a copy of every 100th email this Subuser sends. + +{% anchor h2 %} +Impersonating a Subuser +{% endanchor %} + +When you set up Subusers, it may be useful to see what the Subuser’s settings are and to see what the Subuser can see in the SendGrid UI. +To make this easier, we’ve made it so you can impersonate a Subuser from your parent account and then manage the Subuser the same way as if you had logged in with that user’s credentials, without having to log out of your parent account. + +*To impersonate a Subuser:* + +1. Log into SendGrid. +2. Go to the top left corner of the portal screen and click on your name just above the navigation menu. +3. Click **Switch User**. +4. Choose the Subuser you want to impersonate by clicking that Subuser’s name. + +The page will refresh, and you will notice a message at the top of the screen that says, “You're currently logged in as [Subuser name]”. + +If you have more than one Subuser, you can also switch to another Subuser by clicking **Switch Subuser** in the top-right corner once you are impersonating any Subuser. + +{% anchor h3 %} +Switching back to your parent account +{% endanchor %} + +Click the link at the top left that says “Back to Parent Account”. This will log you out of the Subuser account and take you back to your parent account portal. + + +{% anchor h2 %} +Export Subuser Information +{% endanchor %} + +If you would like to see how your Subusers are performing in comparison to each other, you can export Subuser data. + +*To export Subuser information:* + +1. Navigate to **Settings** and select **Subuser Management**. +1. Click **Export Data**. +
    This downloads a CSV file with each Subuser’s reputation, the number of requests they made this month, and the number of requests they made last month. + + {% anchor h2 %} +Disabling a Subuser account +{% endanchor %} + +*To turn off a Subuser’s access to SendGrid temporarily:* + +1. Navigate to **Settings** and select **Subuser Management**. +1. Locate the Subuser account you wish to disable and click on the name to view the account details. +1. Click **Enable**. + +To re-enable a Subuser’s account, click **Disable**. + +{% anchor h2 %} +Deleting a Subuser account +{% endanchor %} + +{% warning %} +Deleting a Subuser account cannot be undone. Please make sure that you are ready to delete this account before you delete it. All access for this Subuser will immediately be revoked upon deletion. +{% endwarning %} + +*To delete a Subuser account:* + +1. Navigate to **Settings** and select **Subuser Management**. +1. Locate the Subuser account you wish to delete and click on the name to view the account details. +1. On the *Account Settings* page, click **Delete**. + A confirmation window appears. +1. Click **Confirm** to delete the Subuser account. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Assigning a Domain Whitelabel to a subuser]({{root_url}}/Classroom/Basics/Whitelabel/setup_domain_whitelabel.html#-Assigning-a-subuser) +- [Teammates]({{root_url}}/User_Guide/Settings/teammates.html) diff --git a/source/User_Guide/Settings/taxes_and_tax_exempt.md b/source/User_Guide/Settings/taxes_and_tax_exempt.md new file mode 100644 index 0000000000..c29b16df71 --- /dev/null +++ b/source/User_Guide/Settings/taxes_and_tax_exempt.md @@ -0,0 +1,95 @@ +--- +seo: + title: Sales Taxes and Tax-Exempt Status + description: Understand where SendGrid charges taxes, and how to let us know if you have tax-exempt status. + keywords: taxes, tax jurisdictions, tax-exempt +title: Sales Taxes and Tax-Exempt Status +weight: 0 +layout: page +navigation: + show: true +--- + +- [Declaring tax-exempt status](#-Declaring-tax-exempt-status) +- [Declaring reseller status](#-Declaring-reseller-status) +- [Tax FAQ](#-Tax-FAQ) + - [Why does SendGrid collect sales tax?](#-Why-does-SendGrid-collect-sales-tax) + - [Who is required to pay sales tax?](#-Who-is-required-to-pay-sales-tax) + - [Where can I see how much I am getting charged for sales tax each month?](#-Where-can-I-see-how-much-I-am-getting-charged-for-sales-tax-each-month) + - [Can I get an estimate of my sales tax?](#-Can-I-get-an-estimate-of-my-sales-tax) + - [Will my tax amount vary from month to month?](#-Will-my-tax-amount-vary-from-month-to-month) + - [How does SendGrid calculate the sales tax owed?](#-How-does-SendGrid-calculate-the-sales-tax-owed) + - [Other questions?](#-Other-questions) + +SendGrid now collects sales tax in 6 jurisdictions: Denver Colorado, Boulder Colorado, Chicago Illinois, Washington state, New York state, and Texas. We assign tax jurisdiction by the billing address you have in our system. If your billing address is in one of these jurisdictions, and you don't have 501(c)(3) tax-exempt status, you will see a line for sales tax [on your invoice]({{root_url}}/User_Guide/Settings/reading_your_invoice.html). For more information about declaring your tax-exempt status, see [Declaring tax-exempt status](#-Declaring-tax-exempt-status). + +{% anchor h2 %} +Declaring tax-exempt status +{% endanchor %} + +To declare tax-exempt status, email your 501(c)(3) (or equivalent) documentation to billing@sendgrid.com. + +When we receive your paperwork, we'll verify it, and assign you tax-exempt status. + +{% anchor h2 %} +Declaring reseller status +{% endanchor %} + +Resellers are responsible for collecting and verifying their own taxes and taxes for their customers, including sales tax. To declare your status as a SendGrid reseller, email your state reseller permit, purchase for resell exemption certificate, or similar document to billing@sendgrid.com. + +When we receive your paperwork, we'll verify it, and assign you reseller status. + +{% anchor h2 %} +Tax FAQ +{% endanchor %} + +{% anchor h3 %} +Why does SendGrid collect sales tax? +{% endanchor %} + +If SendGrid has a physical presence in a jurisdiction, and we directly sell a taxable product to someone located in that jurisdiction, then we are required to collect sales tax on behalf of that jurisdiction. + +{% anchor h3 %} +Who is required to pay sales tax? +{% endanchor %} + +SendGrid collects sales tax in the following jurisdictions: + +- Denver, Colorado +- Boulder, Colorado +- Chicago, Illinois +- Washington state +- New York state +- Texas + +To determine whether to add sales tax to your monthly SendGrid bill, we use the address you enter as your billing address in [Settings | Plan & Billing Details](https://app.sendgrid.com/settings/billing) in the SendGrid UI. + +{% anchor h3 %} +Where can I see how much I am getting charged for sales tax each month? +{% endanchor %} + +If you are being charged sales tax, you will see it as a line item on your invoice. You’ll be able to find the new sales tax line item by navigating to [Settings | Plan & Billing Details](https://app.sendgrid.com/settings/billing) in the SendGrid UI, then by viewing your invoice, which is in PDF form. + +{% anchor h3 %} +Can I get an estimate of my sales tax? +{% endanchor %} + +Unfortunately, we cannot provide estimates of sales tax for an individual customer ahead of time. The taxes assessed could change monthly for various reasons such as state or local tax laws changing. You can check your bill throughout the month for an estimate of your sales tax. + +{% anchor h3 %} +Will my tax amount vary from month to month? +{% endanchor %} + +Taxes charged can vary month-to-month based on local tax laws changing, or if your product mix causes your bill to be greater or less than in previous months. + +{% anchor h3 %} +How does SendGrid calculate the sales tax owed? +{% endanchor %} + +Tax laws change regularly, so we work with a third party software that focuses on deeply understanding local and state tax laws. SendGrid uses this software to calculate the sales tax you are charged each month. + +{% anchor h3 %} +Other questions? +{% endanchor %} + +If you have any other questions about taxes, send an email to billing@sendgrid.com. diff --git a/source/User_Guide/Settings/teammates.md b/source/User_Guide/Settings/teammates.md index 58feab6bad..7f7823bc8f 100644 --- a/source/User_Guide/Settings/teammates.md +++ b/source/User_Guide/Settings/teammates.md @@ -1,8 +1,8 @@ --- seo: title: Teammates - description: Manage your Teammates - keywords: teammates, teammate + description: Adding and managing Teammates using the SendGrid UI + keywords: teammates, teammate, permissions title: Teammates weight: 0 layout: page @@ -14,138 +14,92 @@ navigation: Table of Contents {% endanchor %} -* [What is Teammates?](#-What-is-Teammates) -* [Where can I find Teammates?](#-Where-can-I-find-Teammates) -* [Who can use Teammates?](#-Who-can-use-Teammates) -* [Setting Up Teammates](#-Setting-Up-Teammates) -* [Teammate Permissions](#-Teammate-Permissions) +* [Adding Teammates](#-Adding-Teammates) * [Managing Teammates](#-Managing-Teammates) + * [Configuring permissions](#-Configuring-permisisons) + * [Removing Teammates](#-Removing-Teammates) + * [Requesting feature access](#-Requesting-feature-access) + * [Granting feature access](#-Granting-feature-access) * [Teammates and API Keys](#-Teammates-and-API-Keys) +Teammates allows multiple users, or teammates, to send email from a single SendGrid account. It enables groups of users to with different roles and responsibilities to share one account, where each of these users has access to varying SendGrid features depending on their needs. By only giving your individual team members access to the features that they need to do their jobs, you can limit access to sensitive areas of your account. Teammates makes it incredibly easy to add, remove, and manage different users. + {% anchor h2 %} -What is Teammates? +Adding Teammates {% endanchor %} -Teammates is an account administration and security tool designed to help manage multiple users, or teammates, on a single SendGrid account. Teammates is targeted toward groups of users who all share a single account, where each of these users has a different role and thus requires access to different SendGrid features. - -There are several benefits to using Teammates. The first and foremost is security: by giving your individual team members access only to the features that they need to do their jobs, you can limit access to sensitive areas of your account. Second, Teammates helps to streamline not only your team members' jobs, but also the job of the admin. Teammates makes it incredibly easy to add, remove, and manage different users. - -For example, a marketer and accountant are going to require access to two very different areas of your account: Marketing Campaigns and Billing. The accountant has no need to create and send marketing email, and the marketer has no need to manage your billing information. By assigning each teammate access only to the pages they need to complete their work, you are able to protect the sensitive financial information contained in the Billing settings, and safeguard the possibility of accidentally sending a campaign. - -{% info %} -Teammates with admin permissions have as much control over an account as the original account owner. This can be useful in the event of an account owner or admin leaving the company. By ensuring that two members of your team have admin access, you can prevent your team from losing access to your SendGrid account. -{% endinfo %} +_To invite a Teammate to your account:_ -{% anchor h3 %} -Where can I find Teammates? -{% endanchor %} +1. Navigate to **Settings**, and click on **Teammates** in the sidebar. +
    This is where you can see the list of all of your current teammates with their details: username, email address, first name, and last name. +2. To add a new Teammate, click **Add Teammate**. +3. Enter the Teammate's email address and then select their permission level. +
    Depending on the selected permission level, you may need to do some additional permission [configuration](#-Configuring-permissions). +4. Click **Invite**. +
    If you have already sent a teammate invitation, you will see a list titled **Pending Invites**. This list contains the email address of the invitee and the invitation expiration date. -To get started using Teammates, simply navigate to **Settings** in the sidebar and select **Teammates**. Continue reading below to learn how to send your first Teammate invitation! - -{% anchor h2 %} -Who can use Teammates? -{% endanchor %} +{% warning %} +Teammate invitations are valid for seven days. +{% endwarning %} {% info %} -Teammates is an improved and expanded version of what was previously referred to as Multiple User Credentials. If you had one or more Multiple User Credentials configured for your account, then those credentials will automatically be migrated to the Teammates platform. +While only administrators can create teammates, it is possible for one administrator to create another teammate with administrator permissions. This new teammate would then be able to create and manage other teammates and have access to the account's billing settings. **Please be very careful about who you assign administrator permissions!** {% endinfo %} -Essentials, [Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html), and Free Trial users may create up to one teammate per account. Pro plans and higher have a limit of 1000 teammates per account/subuser. If you need more please [contact support]({{root_url}}/Classroom/Basics/Misc/support.html). - -If you have an Essentials, [Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html), or Free Trial plan and have created more than one multiple credentialed user, all of those credentialed users [will be migrated to Teammates]({{root_url}}/Classroom/Basics/Account/teammates_faq.html#-What-will-happen-to-my-Multiple-User-Credentials). However you will not be able to create any additional teammates unless you [upgrade to the Pro plan or higher](https://sendgrid.com/pricing/). - -Only account administrators and teammates with admin access are able to create and manage teammates. Subuser accounts also have access to Teammates, but they will be unable to manage teammates on the parent account level. - {% info %} -While only administrators can create teammates, it is possible for one administrator to create another teammate with administrator permissions. This new teammate would then be able to create and manage other teammates, along with having access to the account's billing settings. **Please be very careful about who you assign administrator permissions!** +Only administrator teammates may impersonate subusers. {% endinfo %} {% anchor h2 %} -Setting Up Teammates -{% endanchor %} - -{% anchor h3 %} -Adding a Teammate as an Administrator +Managing Teammates {% endanchor %} {% info %} -Only administrator teammates may impersonate subusers! -{% endinfo %} - -To invite a teammate to your account, navigate to **Settings**, and click on **Teammates** in the sidebar. - -This is where you can see the list of all of your current teammates with their details: username, email address, first name, and last name. By clicking the action cog under **Actions** you can either delete the teammate, or edit that teammate. - -If you have already sent a teammate invitation, you will see a list titled **Pending Invites**. Under this list you will see the email address the invite was sent to along with the invitation expiration date. - -{% warning %} -Teammate invitations are valid for 7 days. -{% endwarning %} - -Click **Add Teammate** to open the modal window allowing you to specify the email address and permissions of your new teammate. - -![Teammates]({{root_url}}/images/teammates_1.png) - -{% info %} -Essentials, [Legacy Lite]({{root_url}}/Classroom/Basics/Billing/legacy_lite_plan.html), and Free Trial users may create up to one teammate per account. Pro and higher plans may create up to a limit of 1000 teammates. +Only administrator teammates may impersonate subusers. {% endinfo %} -You should now see a modal window titled "New Teammate." Here you will enter your teammate's email address and select the type of teammate you would like to add. The teammate type dictates what permissions your new teammate will have. - -![Adding a new teammate]({{root_url}}/images/teammates_2.png) - -{% anchor h2 %} -Teammate Permissions +{% anchor h3 %} +Configuring permissions {% endanchor %} -By selecting a type, you can choose from several pre-defined permission levels to fit a variety of common roles: **Developer Access**, **Marketer Access**, and **Accountant Access** or you can customize access for the teammate. - The three different permission levels are: -* **NO ACCESS -** Teammates with no access to a feature not only will be prevented from changing that feature’s settings, but they will also be unable to even view that feature within the SendGrid UI. However, they may still [request access to that feature](#-Requesting-Access-to-a-SendGrid-Feature). -* **READ ACCESS -** Teammates with read only access will not be able to change or configure a feature. However, they will be able to view any information provided by that feature. -* **FULL ACCESS -** Teammates with full access to a feature can view and make any changes. +* **Restricted Access -** Teammates with no access to a feature cannot change that feature’s settings or view it within the SendGrid UI.. However, you can still [grant them access to specific features](#-Granting-feature-access). +* **Read-only Access -** Teammates with read-only access will not be able to change or configure a feature. However, they will be able to view any information provided by that feature. +* **Admin -** Teammates with full access that can view and make any changes. -![Teammate Permissions]({{root_url}}/images/teammates_3.png) +If you select **Invite with Restricted Access** when inviting a Teammate, you need to select a preset access level or create your own by selecting **Custom Access**. You can choose from several pre-defined permission levels to fit a variety of roles: Developer Access, Marketer Access, and Accountant Access or you can customize access for the teammate. -{% info %} -Only administrator teammates may impersonate subusers! -{% endinfo %} +_To modify an existing teammate's permissions:_ -Once you select a teammate type and have entered a valid email address, you may either click **Create** to send the teammate invitation, or you can further customize the permissions levels for your teammate. - -After you have sent the teammate invitation, you will see a new entry underneath **Pending Invites** on the Teammates page under **Settings**. Teammate invitations expire after 7 days. You can delete an invitation, or resend the invitation, by clicking the action cog under Actions. +1. Navigate to the **Teammates Page** under **Settings**. +1. Under the list of current teammates, click the action menu next to the teammate you would like to edit. +1. Click **Edit** to open a modal window presenting the teammate's current permissions. +1. Make your desired changes and click **Update**. {% anchor h3 %} -Accepting a Teammate Invitation +Removing Teammates {% endanchor %} -If someone has invited you to join their SendGrid account as a teammate, you should receive an email with the subject line "You're invited to join John Doe's team on SendGrid!" where John Doe is the administrator who invited you. - -To accept the invitation, simply open the email and click **Set up your Profile**. This will take you to the SendGrid website displaying a modal window asking for your first name, last name, desired username, and password. +_To delete a teammate:_ -![Teammate Invitation Email]({{root_url}}/images/teammates_5.png) +1. Navigate to the **Teammates Page** under **Settings**. +1. Click the action menu next to the teammate you want to delete and click **Delete**. -Once you've filled out these fields, click **Sign In**. - -{% info %} -Teammate invitations are valid for 7 days. If you click the link to **Set up your Profile** in the invitation and discover that your invitation has expired, you must reach out to your account administrator to request a new invitation. -{% endinfo %} - -![Teammate Account Created Successfully]({{root_url}}/images/teammates_6.png) +{% warning %} +You cannot recover deleted teammates. Once a teammate has been deleted, it can never be restored. SendGrid will not remove any templates, campaigns, contacts, or API keys created by the teammate. +{% endwarning %} -{% anchor h3 %} -Requesting Access to a SendGrid Feature +{% anchor h2 %} +Requesting feature access {% endanchor %} -If you are already signed into a SendGrid account as a teammate, but do not have access to a certain page or feature, you may request access to that page simply by clicking **Request Access**. - -This will send a notification to the account administrator who can grant you access. If there is more than one administrator, each administrator will be notified. +If you are already signed into a SendGrid account as a teammate, but do not have access to a page or feature, you may request access to that page by clicking **Request Access**. -![Requesting Access to a Feature]({{root_url}}/images/teammates_7.png) +Once a request is made, all account administrators recieve a notification via email that a request is pending approval. {% anchor h3 %} -Granting Access to a SendGrid Feature (Administrators) +Granting feature access {% endanchor %} You can find any access requests listed under **Pending Requests** on the **Teammates** page in your Settings. The request will list the username of the teammate, their email address, their first and last names, along with the feature that they requested access to. @@ -153,42 +107,24 @@ You can find any access requests listed under **Pending Requests** on the **Team To grant that teammate access to the feature, click **Approve**. {% warning %} -**By clicking "Approve", you are giving that teammate full access to the feature!** If you only want to give them limited access to the feature, you must navigate back to their teammate settings to make adjustments to their granular permissions. +**By clicking "Approve" you are giving that teammate full access to the feature!** If you only want to give them limited access to the feature, you must navigate back to their teammate settings to make adjustments to their granular permissions. {% endwarning %} -If you do not want to grant them access, simply click **Deny**. - -![Granting Access to a Feature]({{root_url}}/images/teammates_9.png) +If you do not want to grant them access, click **Deny**. {% info %} -A notification email will be sent to the teammate when they are either granted or denied access. This email will be delivered by SendGrid, but the "reply to" address will be the email address on file for the account owner. +The teammate receives a notification email when they are either granted or denied access. SendGrid delivers these emails, but the "reply to" address is the email address on file for the account owner. {% endinfo %} -![Access Granted Notification]({{root_url}}/images/teammates_11.png) - {% anchor h2 %} Managing Teammates {% endanchor %} -To modify an existing teammate's permissions, navigate to the **Teammates Page** under **Settings**. Under the list of current teammates, click the action cog next to the teammate you would like to edit. - -Click **Edit** to open a modal window presenting the teammate's current permissions. Make your desired changes and click **Update**. - -To delete a teammate, navigate to the **Teammates Page** under **Settings**. Click the action cog next to the teammate you want to delete and click **Delete**. - -![Deleting a Teammate]({{root_url}}/images/teammates_10.png) - -{% warning %} -You cannot recover a deleted teammate! Please be certain before deleting one of your teammates. -{% endwarning %} - {% anchor h2 %} Teammates and API Keys {% endanchor %} -There are many similarities between Teammates and API Keys that are worth discussing as the interaction between these two features may lead to some confusion. - -API Keys are used to authenticate API calls. Just as a teammate can be given specific permissions, API keys can be assigned specific [permissions]({{root_url}}/Classroom/Basics/API/api_key_permissions.html) to restrict which API calls they can authenticate. +API Keys are used to authenticate API calls. Just as a teammate can be given specific permissions, API keys can be assigned specific [permissions]({{root_url}}/API_Reference/Web_API_v3/API_Keys/api_key_permissions_list.html) to restrict which API calls they can authenticate. {% info %} API Keys and Teammates can be used as two different methods of restricting access to the same SendGrid features. @@ -196,11 +132,11 @@ API Keys and Teammates can be used as two different methods of restricting acces However, a teammate cannot change their own permissions via API key. For example, a teammate with restricted access to features in the SendGrid user interface but full access to API Keys cannot make an API call to modify their permissions in the user interface. {% endinfo %} -To learn how to create and manage Teammates via our Web API v3, please visit our [API Reference]({{root_url}}/API_Reference/Web_API_v3/teammates.html) {% anchor h2 %} Related Resources {% endanchor %} * [API Reference]({{root_url}}/API_Reference/Web_API_v3/teammates.html) -* [Frequently Asked Questions]({{root_url}}/Classroom/Basics/Account/teammates_faq.html) +* [Glossary](https://sendgrid.com/docs/Glossary/teammates.html) + diff --git a/source/User_Guide/Settings/tracking.md b/source/User_Guide/Settings/tracking.md index 547c879aee..f504a3fa1e 100644 --- a/source/User_Guide/Settings/tracking.md +++ b/source/User_Guide/Settings/tracking.md @@ -14,7 +14,7 @@ navigation: Click Tracking {% endanchor %} -Enabling Click Tracking causes all the links and URLs in your emails to be overwritten and pointed to either SendGrid’s servers or your whitelabeled link domain so that any time a customer clicks a link, SendGrid can track those [clicks]({{root_url}}/Glossary/clicks.html). SendGrid can track up to 1000 links per email. +Enabling Click Tracking causes all the links and URLs in your emails to be overwritten and pointed to either SendGrid’s servers or the domain you branded your link with so that any time a customer clicks a link, SendGrid can track those [clicks]({{root_url}}/Glossary/clicks.html). SendGrid can track up to 1000 links per email. {% anchor h3 %} Settings @@ -51,7 +51,7 @@ Open Tracking {% endanchor %} {% info %} -If you are using email link whitelabeling, then your open tracking image will be served from your whitelabel domain instead of from SendGrid.net. +If you are using email link branding, then your open tracking image will be served from your branded domain instead of from SendGrid.net. {% endinfo %} Open Tracking adds an invisible, one pixel image at the end of the email which can track email [opens]({{root_url}}/Glossary/opens.html). If the email recipient has images enabled on their email client and a request to SendGrid’s server for the invisible image is executed, then an open event is logged. These events are logged in the Statistics UI, Email Activity interface, and are reported by the Event Webhook. @@ -82,7 +82,7 @@ You can customize the text attached to emails and customize the landing page. Th Settings {% endanchor %} -**Replacement Tag** - Your custom defined tag for your templates. Use this to place your unsubscribe content wherever you want in your template. If you don’t provide this, your unsubscribe link will be automatically added to the bottom of your email. +**Replacement Tag** - Your custom defined tag for your templates. Use this to place your unsubscribe URL wherever you want in your template. If you provide this, make sure you put it within an ` Two-factor authentication, commonly referred to as multi-factor authentication, allows you to make your SendGrid account more secure by requiring authentication beyond a simple username and password when logging in. -SendGrid’s Two-Factor Authentication can be configured to accept a code sent to your mobile phone either via the the [Authy App](https://www.authy.com/app/mobile/), or an SMS message. +SendGrid’s Two-Factor Authentication can be configured to accept a code sent to your mobile phone either via the [Authy App](https://www.authy.com/app/mobile/), or an SMS message. + +* [Setting Up Two-Factor Authentication](#-Setting-Up-Two-Factor-Authentication) +* [Using Two-Factor Authentication](#-Using-Two-Factor-Authentication) +* [Disabling Two-Factor Authentication](#-Disabling-Two-Factor-Authentication) +* [Regaining access to my account when I've been locked out by Two-Factor Authentication](#-Regaining-access-to-my-account-when-I--ve-been-locked-out-by-Two-Factor-Authentication) {% anchor h2 %} -How To Set Up Two-Factor Authentication -{% endanchor %} +Setting Up Two-Factor Authentication +{% endanchor h2 %} You may choose from two different verification methods when using two-factor authentication: -1. Generating a verification code in the [Authy App](https://www.authy.com/app/mobile/). -2. Entering a code sent to your mobile phone that is generated by SendGrid. - -

    -

    -
    -

    - The Authy App allows you to authenticate over WiFi if you do not have cellular service. However, you may still resort to an SMS message as a backup if you decide to use Authy. -

    -
    -
    - -
    -
    -

    - -

    -

    -
    - -
    -
    -

    -
    -
    - When authenticating via SMS message, you must have cellular service or you will not be able to log into your account. -

    -
    -
    -

    +1. Generate a verification code with the [Authy App](https://www.authy.com/app/mobile/). + The Authy App allows you to authenticate over WiFi if you do not have cellular service. However, you may still resort to an SMS message as a backup if you decide to use Authy. +1. Enter a code sent to your mobile phone that is generated by SendGrid. -To set up Two-Factor Authentication, navigate to your **Settings**, and click **Two-Factor Authentication**. From this page, you will be able to see an overview of your Two-Factor Authentication settings, along with any settings that you have created for Credentialed Users. +{% warning %} +When authenticating via SMS message, you must have cellular service, or you will not be able to log into your account. +{% endwarning %} -To add a new Two-Factor Authentication setting, click **Add Two-Factor Authentication**. +{% info %} +You can create multiple configurations of Two-Factor Authentication, allowing you to use more than one mobile device to authenticate when logging into your account. +{% endinfo %} -![]({{root_url}}/images/2fa_3.png) +*To set up Two-Factor Authentication:* -You will then be presented with a window allowing you to select either the Authy App or text messages (SMS) as your means of authentication. +1. Navigate to **Settings**, and click **Two-Factor Authentication**. +
    From this page, you see an overview of your Two-Factor Authentication settings, along with any settings that you have created for credentialed users. +1. Click **Add Two-Factor Authentication**. +1. Select either the Authy App or text messages (SMS) as your means of authentication. +1. Enter your **country code** and **phone number**. -![]({{root_url}}/images/2fa_4.png) +{% info %} +Subusers and Teammates need to create their own Two-Factor Authentication settings in their account using the same steps. +{% endinfo %} -If you select the Authy App, you will then need to enter your **country code** and **phone number**. - -After clicking Next, you will be sent a message with information on how to install the Authy App. The phone number that you provide will also be used as your backup means of authentication if you run into problems with the Authy App. - -Once you have installed the Authy App, you will be given a **7-digit token**. Enter this token and click save. +{% anchor h2 %} +Using Two-Factor Authentication +{% endanchor h2 %} -![]({{root_url}}/images/2fa_5.png) +After you create a setting for Two-Factor Authentication, log in as you normally would. If you opt to receive a text message with your authentication token, look for the text message and enter the code that you receive. If you have selected the Authy App, go to your app, and enter the generated code. -After you have installed the Authy App and entered the 7-digit token, your new Two-Factor Authentication setting is verified and ready for use. +Once set up, you will always be required to use Two-Factor Authentication to perform security-restricted actions in your SendGrid account, such as logging in or changing your Two-Factor Authentication settings. When prompted, enter the 7-digit token sent to your device, or generated by the Authy App. -![]({{root_url}}/images/2fa_6.png) +{% anchor h2 %} +Disabling Two-Factor Authentication +{% endanchor h2 %} -You may back out of the setup process at any time without fear of locking yourself out of your account. We will create an entry labeled “Not Verified”, allowing you to delete the setting without consequence, or verify it for future use. +*To disable or delete a Two-Factor Authentication setting:* -![]({{root_url}}/images/2fa_7.png) +1. Navigate to **Settings**, and click **Two-Factor Authentication**. +1. Find the setting you would like to delete. +1. Click the **action menu**, and then select **Delete**. +1. Enter the 7 digit code you receive via text or Authy app into the field and then click **Delete**. {% anchor h2 %} -Using Two-Factor Authentication -{% endanchor %} +Regaining access to my account after being locked out by Two-Factor Authentication +{% endanchor h2 %} -After you have created a setting for Two-Factor Authentication, simply log in as you normally would. If you have selected to receive a text message with your authentication token, look for the text message and enter the code that you receive. If you have selected the Authy App, go to your app, and enter the generated code. - -Once setup, you will always be required to use Two-Factor Authentication to perform security-restricted actions in your SendGrid account, such as logging in or changing your Two-Factor Authentication settings. When prompted, simply enter the 7-digit token sent to your device, or generated by the Authy App. +If you find that you’ve lost access to your account as a result of Two-Factor Authentication, please reach out to the [Authy Support Team](https://support.authy.com/hc/en-us). {% anchor h2 %} -Disabling Two-Factor Authentication -{% endanchor %} - -To disable or delete a Two-Factor Authentication setting, navigate to the **Two-Factor Authentication overview page**. Find the setting you would like to delete, click the **Action Cog**, and select **Delete**. - -
    -
    -

    - You will then be shown a window in which to enter a 7-digit authentication token sent to your mobile phone via text message or generated by your Authy App. -

    -

    - Enter this token to confirm that you may delete this setting, then click Delete. -

    -
    -
    - -
    -
    +Additional Resources +{% endanchor h2 %} + +* [Restoring Authy access on lost or inaccessible phones](https://support.authy.com/hc/en-us/articles/115012672088-Restoring-Authy-access-on-lost-or-inaccessible-phones) diff --git a/source/User_Guide/Statistics/browser.md b/source/User_Guide/Statistics/browser.md index 4eb36705ec..19acf42826 100644 --- a/source/User_Guide/Statistics/browser.md +++ b/source/User_Guide/Statistics/browser.md @@ -22,7 +22,7 @@ There are similarities between Device and Browser statistics and we are working Choose a browser from the list to see statistics about how your recipients interact with your email based on the application they use to look at the internet. -The actual statistics included vary depending upon [your account settings]({{root_url}}/User_Guide/Settings/index.html). Emails sent, bounces and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled. +The actual statistics included vary depending upon [your account settings]({{root_url}}/User_Guide/Settings/account.html). Emails sent, bounces and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled. You can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters). @@ -33,3 +33,11 @@ Figures The figures table gives you all of the specific counts or percentages of each event, according to how you’ve grouped your stats (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the second week of April based on the browser, this is a great place to look. This table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Account Settings]({{root_url}}/User_Guide/Settings/account.html) +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) +- [Browser Comparison]({{root_url}}/User_Guide/Statistics/browser_compare.html) diff --git a/source/User_Guide/Statistics/browser_compare.md b/source/User_Guide/Statistics/browser_compare.md index 381e58ff22..2e556ff52a 100644 --- a/source/User_Guide/Statistics/browser_compare.md +++ b/source/User_Guide/Statistics/browser_compare.md @@ -39,3 +39,11 @@ Individual Metrics Figures This table will be titled “Figures for Delivered” and will show you the actual delivery numbers over time for each of the compared browsers. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) +- [Subusers]({{root_url}}/User_Guide/Settings/Subusers/index.html) +- [Statistics]({{root_url}}/User_Guide/Statistics/index.html) diff --git a/source/User_Guide/Statistics/categories.md b/source/User_Guide/Statistics/categories.md index 58e6cd45bf..aa24341ff4 100644 --- a/source/User_Guide/Statistics/categories.md +++ b/source/User_Guide/Statistics/categories.md @@ -16,7 +16,7 @@ Parent accounts will see aggregated stats for their account and all subuser acco Categories can help organize your email analytics by enabling you to “tag” emails by type. Just as you can view the statistics on all your [email activity]({{root_url}}/User_Guide/email_activity.html), you can go a step further and view the statistics broken down to a particular category. -The actual statistics included vary depending upon your [account settings]({{root_url}}/User_Guide/Settings/index.html). Emails sent, bounces and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled. +The actual statistics included vary depending upon your [account settings]({{root_url}}/User_Guide/Settings/account.html). Emails sent, bounces and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled. In order to see statistics for a category, select the category and the page will show you both a graph and a table of your category’s email statistics. @@ -35,3 +35,11 @@ Using the API {% endanchor %} [Using Categories with the SMTP API]({{root_url}}/API_Reference/SMTP_API/categories.html) + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Email Activity]({{root_url}}/User_Guide/email_activity.html) +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) +- [Account Settings]({{root_url}}/User_Guide/Settings/account.html) diff --git a/source/User_Guide/Statistics/category_compare.md b/source/User_Guide/Statistics/category_compare.md index 0d174cb520..7a2579a7df 100644 --- a/source/User_Guide/Statistics/category_compare.md +++ b/source/User_Guide/Statistics/category_compare.md @@ -55,3 +55,11 @@ You can remove individual categories from the list of categories you selected in To change this graph to see another metric, click the button inline with the graph title and choose another metric. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Subusers]({{root_url}}/User_Guide/Settings/Subusers/index.html) +- [Using Categories with the SMTP API]({{root_url}}/API_Reference/SMTP_API/categories.html) +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) diff --git a/source/User_Guide/Statistics/device.md b/source/User_Guide/Statistics/device.md index eecfa494ef..91896f3986 100644 --- a/source/User_Guide/Statistics/device.md +++ b/source/User_Guide/Statistics/device.md @@ -15,7 +15,7 @@ navigation: Parent accounts will see aggregated stats for their account and all subuser accounts. Subuser accounts will only see their own stats. {% endinfo %} -The clients report breaks down which devices and clients are most frequently used to open the mail you send. The devices and types that SendGrid tracks are: +The clients report breaks down which devices and clients are most frequently used to open the mail you send. The devices and types that SendGrid tracks are: @@ -72,3 +72,11 @@ When you initially choose the devices to compare, this graph will show you the a You can remove individual devices from the list of devices at the top of this page. The graph will refresh, showing only the selected subusers. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) +- [Subusers]({{root_url}}/User_Guide/Settings/Subusers/index.html) +- [SendGrid for Mobile]({{root_url}}/User_Guide/SendGrid_for_Mobile/index.html) diff --git a/source/User_Guide/Statistics/geo.md b/source/User_Guide/Statistics/geo.md index 9a7e217889..2b3b5a62e2 100644 --- a/source/User_Guide/Statistics/geo.md +++ b/source/User_Guide/Statistics/geo.md @@ -37,3 +37,11 @@ The figures table gives you all of the specific counts or percentages of each ev This table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. To see only the figures from a specific geographic area, change the Activity Map to be either the world view or a specific country, then select the countries or states you want to see in the figures table using the buttons just above and to the right of the figures data. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) +- [Global Stats]({{root_url}}/API_Reference/Web_API_v3/Stats/global.html) +- [Timezones]({{root_url}}/Glossary/timezone.html) diff --git a/source/User_Guide/Statistics/global.md b/source/User_Guide/Statistics/global.md index 8dfbb9efa8..3e20946296 100644 --- a/source/User_Guide/Statistics/global.md +++ b/source/User_Guide/Statistics/global.md @@ -12,7 +12,7 @@ navigation: {% info %} -Parent accounts will see aggregated stats for their account and all subuser accounts. Subuser accounts will only see their own stats. +Global stats shown are not an aggregate total for parent accounts and subusers. The stats outlined will only contain data for whichever account you are currently accessing. Subuser stats can, however, be accessed from the Parent account's Stats menu either on an individual basis, or by comparing multiple subusers. {% endinfo %} Your Global Stats page is where you can really dig into your email stats. From here you will be able to filter through your stats by type, but you will also be able to look at the actual numbers for each stat by date. You can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters). @@ -24,3 +24,11 @@ Figures The figures table gives you all of the specific counts or percentages of each event, according to how you’ve grouped your stats (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the 2nd week of April, this is a great place to check. This table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) +- [Global Stats]({{root_url}}/API_Reference/Web_API_v3/Stats/global.html) +- [Timezones]({{root_url}}/Glossary/timezone.html) diff --git a/source/User_Guide/Statistics/index.html b/source/User_Guide/Statistics/index.html index 7a8f741ecb..1e6b1dd2c9 100644 --- a/source/User_Guide/Statistics/index.html +++ b/source/User_Guide/Statistics/index.html @@ -18,9 +18,14 @@ Tracking your emails is an important part of being a good sender and learning about how your users interact with your email. This includes everything from basics of clicks and opens to looking at which browsers and mailbox providers your customers use.

    -We have broken up stats in specific ways so that you can get at-a-glance data, as well as allowing you to get into the details of how your email is being used. +We have broken up stats in specific ways so that you can get at-a-glance data, as well as allowing you to get into the details of how your email is being used.

    +- [Available Email Statistics Reports](#-Available-Email-Statistics-Reports) +- [Metrics](#-Metrics) +- [Statistics_Filter](#-Statistics-Filters) +- [Top_5_Categories](#-Top-5-Categories) + {% anchor h2 %} Available Email Statistics Reports {% endanchor %} @@ -111,5 +116,15 @@ {% endanchor %}

    - The Top 5 Categories report allows you to see your top 5 most used categories by number of requests. Switch your view by actual number of emails or percentage using the toggle at the top right of this section. + The Top 5 Categories report allows you to see your top 5 most used categories by number of requests. Switch your view by actual number of emails or percentage using the toggle at the top right of this section.

    + +{% anchor h2 %} +Additional Resources +{% endanchor %} + + diff --git a/source/User_Guide/Statistics/mailbox_provider.md b/source/User_Guide/Statistics/mailbox_provider.md index 152324cb14..6bf14fbb88 100644 --- a/source/User_Guide/Statistics/mailbox_provider.md +++ b/source/User_Guide/Statistics/mailbox_provider.md @@ -14,9 +14,9 @@ navigation: Parent accounts will see aggregated stats for their account and all subuser accounts. Subuser accounts will only see their own stats. {% endinfo %} -The [mailbox provider statistics](https://app.sendgrid.com/statistics/mailbox_provider) highlights how your mail performs across all the major providers, such as Hotmail, Yahoo, Gmail, and others. The list of available providers is based on your recipient interaction with your emails. As you send mail and your recipient list diversifies, you will start to see more providers in the list. +The [mailbox provider statistics](https://app.sendgrid.com/statistics/mailbox_provider) highlights how your mail performs across all the major providers, such as Hotmail, Yahoo, Gmail, and others. The list of available providers is based on your recipient interaction with your emails. As you send mail and your recipient list diversifies, you will start to see more providers in the list. -The actual statistics included vary depending upon your [account settings]({{root_url}}/User_Guide/Settings/index.html). Emails sent, bounces and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled. +The actual statistics included vary depending upon your [account settings]({{root_url}}/User_Guide/Settings/account.html). Emails sent, bounces and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled. You can change which metrics, date, or grouping by adjusting the [statistics filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters). @@ -27,3 +27,11 @@ Figures The figures table gives you all of the specific counts or percentages of each event, according to how you’ve grouped your stats (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the second week of April, this is a great place to check. This table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Mailbox Provider Stats]({{site.app_url}}/statistics/mailbox_provider) +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) +- [Account Settings]({{root_url}}/User_Guide/Settings/account.html) diff --git a/source/User_Guide/Statistics/mailbox_provider_compare.md b/source/User_Guide/Statistics/mailbox_provider_compare.md index 46384fffaf..fc81a76617 100644 --- a/source/User_Guide/Statistics/mailbox_provider_compare.md +++ b/source/User_Guide/Statistics/mailbox_provider_compare.md @@ -38,3 +38,11 @@ Individual Metrics Figures This table will be titled “Figures for Delivered” and will show you the actual delivery numbers over time for each of the compared providers. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Mailbox Provider Stats]({{site.app_url}}/statistics/mailbox_provider) +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) +- [Account Settings]({{root_url}}/User_Guide/Settings/account.html) diff --git a/source/User_Guide/Statistics/parse.md b/source/User_Guide/Statistics/parse.md index e1303cba45..13e117cf0e 100644 --- a/source/User_Guide/Statistics/parse.md +++ b/source/User_Guide/Statistics/parse.md @@ -21,3 +21,11 @@ Using the API {% endanchor %} To use the Inbound Parse Webhook, please check out [Setting Up the Inbound Parse Webhook]({{root_url}}/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html) and our [Inbound Parse API documentation]({{root_url}}/API_Reference/Webhooks/parse.html). + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Webhooks Overview]({{root_url}}/API_Reference/Webhooks/index.html) +- [Debugging a Webhook]({{root_url}}/API_Reference/Webhooks/debug.html) +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) diff --git a/source/User_Guide/Statistics/subuser.md b/source/User_Guide/Statistics/subuser.md index f30df0b0dd..60e273e6df 100644 --- a/source/User_Guide/Statistics/subuser.md +++ b/source/User_Guide/Statistics/subuser.md @@ -12,7 +12,7 @@ navigation: Subusers can help organize your email sending and analytics by enabling you to segment by a different sender and IP address. Just as you can view the statistics on all your [email activity]({{root_url}}/User_Guide/email_activity.html), you can go a step further and view the statistics broken down to a particular subuser. -The actual statistics included vary depending upon your [account settings]({{root_url}}/User_Guide/Settings/index.html). Emails sent, bounces and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled. +The actual statistics included vary depending upon your [account settings]({{root_url}}/User_Guide/Settings/account.html). Emails sent, bounces and spam reports will always get tracked. Unsubscribes, clicks, and opens require that the associated settings are enabled. In order to see statistics for a subuser, select the subuser and the page will show you both a graph and a table of email statistics. @@ -25,3 +25,11 @@ Figures The figures table gives you all of the specific counts or percentages of each event, according to how you’ve grouped your stats (day, week, or month). For example, if you wanted to see what percentage of the emails you sent were actually opened on the second week of April, this is a great place to check. This table will refresh with new or adjusted data based on the various filters available at the top of the page. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Subuser Stats]({{root_url}}/API_Reference/Web_API_v3/Stats/subusers.html) +- [Email Activity]({{root_url}}/User_Guide/email_activity.html) +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) diff --git a/source/User_Guide/Statistics/subuser_compare.md b/source/User_Guide/Statistics/subuser_compare.md index 859da11913..9a4dbc9571 100644 --- a/source/User_Guide/Statistics/subuser_compare.md +++ b/source/User_Guide/Statistics/subuser_compare.md @@ -55,3 +55,11 @@ You can remove individual subusers from the list of categories you selected init To change this graph to see another metric, click the button inline with the graph title and choose another metric. You can also choose to show actual counts or percentages, by clicking the corresponding button above and to the right of the table. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Subuser Stats]({{root_url}}/API_Reference/Web_API_v3/Stats/subusers.html) +- [Email Activity]({{root_url}}/User_Guide/email_activity.html) +- [Statistics Filters]({{root_url}}/User_Guide/Statistics/index.html#-Statistics-Filters) diff --git a/source/User_Guide/Suppressions/advanced_suppression_manager.md b/source/User_Guide/Suppressions/advanced_suppression_manager.md index 861f9b23bb..2f6899b02b 100644 --- a/source/User_Guide/Suppressions/advanced_suppression_manager.md +++ b/source/User_Guide/Suppressions/advanced_suppression_manager.md @@ -16,6 +16,16 @@ When a user unsubscribes from a type of email being sent to them at the sender a For example, if you had an outdated email list (not something we recommend by the way) and sent an email to that list, but a user on that list had previously unsubscribed from that type of email from you, they would not get the email because the email would never leave SendGrid. It would be suppressed from being sent. A contact’s emails will only be suppressed if they unsubscribe from that sender’s emails, unsubscribing from one sender’s list will have no effect on suppression lists owned by other senders. +* [Overview](#Overview) +* [Add An Unsubscribe Group](#-Add-An-Unsubscribe-Group) +* [Default Groups](#-Default-Groups) +* [Add Recipients to an Unsubscribe Group](#-Add-Recipients-to-an-Unsubscribe-Group) +* [Upload a CSV To Add Unsubscribe Group Recipients](#-Upload-a-CSV-To-Add-Unsubscribe-Group-Recipients) +* [Export an Unsubscribe Group List](#-Export-an-Unsubscribe-Group-List) +* [Edit an Unsubscribe Group](#-Edit-an-Unsubscribe-Group) +* [Delete an Unsubscribe Group](#-Delete-an-Unsubscribe-Group) +* [Using the API](#-Using-the-API) + {% anchor h2 %} Overview {% endanchor %} @@ -30,7 +40,7 @@ You can then give your recipients more control over the types of emails they wan Make sure your group names and descriptions are customer friendly! Your customers will see these group names and descriptions when they unsubscribe from your emails. {% endinfo %} -All of your groups will be visible on the [Suppression Management]({{site.app_url}}/suppressions/advanced_suppression_manager) page, along with the descriptions you defined when you created the groups. There are also [Suppression Management API]({{root_url}}/API_Reference/Web_API_v3/Suppression_Management/index.html) endpoints for managing your groups and suppressions. +All of your groups will be visible on the [Suppression Management]({{site.app_url}}/suppressions/advanced_suppression_manager) page, along with the descriptions you defined when you created the groups. There are also [Suppression Management API]({{root_url}}/API_Reference/Web_API_v3/Suppression_Management/index.html) endpoints for managing your groups and suppressions. {% anchor h2 %} Add An Unsubscribe Group @@ -46,7 +56,7 @@ Default Groups Default groups are those that are shown by default when a recipient chooses to unsubscribe from your emails. SendGrid will always show all of the default groups, so if you don’t want one of those groups to be displayed all the time, make sure that it is not set as a default group. -You can also specify which groups to display at send time, but using the [asm_groups_to_display feature]({{root_url}}/API_Reference/SMTP_API/suppressions.html#-Defining-ASM-Groups-to-display-on-the-Manage-Preferences-page) of the SMTP API. +You can also specify which groups to display at send time, but using the [asm_groups_to_display feature]({{root_url}}/API_Reference/SMTP_API/suppressions.html#-Defining-ASM-Groups-to-display-on-the-Manage-Preferences-page) of the SMTP API. {% anchor h2 %} Add Recipients to an Unsubscribe Group @@ -72,7 +82,7 @@ To upload a CSV of recipients who should not receive this group’s emails, clic Manually Add Unsubscribe Group Recipients {% endanchor %} -To manually add a recipient who should not receive this group’s emails, click the gear icon at the right of the unsubscribe group name. When you select “manual add” a window will pop out with a form where you can enter a valid email address. Once you click “Done”, any emails sent with this unsubscribe group will not go to this recipient. To view which group a recipient is in, go to the [Group Unsubscribes]({{site.app_url}}/suppressions/group_unsubscribes) page and search by that recipient’s email address. +To manually add a recipient who should not receive this group’s emails, click the gear icon at the right of the unsubscribe group name. When you select “manual add” a window will pop out with a form where you can enter a valid email address. Once you click “Done”, any emails sent with this unsubscribe group will not go to this recipient. To view which group a recipient is in, go to the [Group Unsubscribes]({{site.app_url}}/suppressions/group_unsubscribes) page and search by that recipient’s email address. {% anchor h2 %} Export an Unsubscribe Group List @@ -101,3 +111,11 @@ Using the API {% endanchor %} When you use the [SendGrid API with unsubscribe groups]({{root_url}}/API_Reference/Web_API_v3/Suppression_Management/index.html), you can include the unsubscribe group ID with your mail send calls. To get the ID, go to your unsubscribe group list and you will find the ID in the “Group ID” column. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Bounces]({{root_url}}/User_Guide/Suppressions/bounces.html) +- [Group Unsubscribes]({{site.app_url}}/suppressions/group_unsubscribes) +- [SendGrid API with unsubscribe groups]({{root_url}}/API_Reference/Web_API_v3/Suppression_Management/index.html) diff --git a/source/User_Guide/Suppressions/blocks.md b/source/User_Guide/Suppressions/blocks.md index 3e9eddf152..02a8406164 100644 --- a/source/User_Guide/Suppressions/blocks.md +++ b/source/User_Guide/Suppressions/blocks.md @@ -10,7 +10,7 @@ navigation: show: true --- -[Blocks]({{root_url}}/Glossary/blocks.html) happen when your message was rejected for a reason related to the message, not the recipient address. This can happen when your mail server IP address has been added to a blacklist or blocked by an ISP, or if the message content is flagged by a filter on the receiving server. +[Blocks]({{root_url}}/Glossary/blocks.html) happen when your message was rejected for a reason related to the message, not the recipient address. This can happen when your mail server IP address has been added to a blacklist or blocked by an ISP, or if the message content is flagged by a filter on the receiving server. The “Reason on the Block” will clarify what the exact reason is. Typically, it’s possible to have your IP address removed from a blacklist, and some lists automatically do this after a period of time. Message content can be modified to correct a filtered block. @@ -37,3 +37,11 @@ Download Blocks as CSV {% endanchor %} You can download your Global Unsubscribe list as a CSV by clicking the gear icon at the top of the page and selecting “Download CSV.” The file will download in your browser right away. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Bounces]({{root_url}}/User_Guide/Suppressions/bounces.html) +- [Global Unsubscribes]({{root_url}}/User_Guide/Suppressions/global_unsubscribes.html) +- [Web API and Blocks]({{root_url}}/API_Reference/Web_API/blocks.html) diff --git a/source/User_Guide/Suppressions/bounces.md b/source/User_Guide/Suppressions/bounces.md index 0d1c918600..f59896635e 100644 --- a/source/User_Guide/Suppressions/bounces.md +++ b/source/User_Guide/Suppressions/bounces.md @@ -10,13 +10,13 @@ navigation: show: true --- -A bounce occurs when a sent message is rejected by the receiving mail server. The most common causes for bounced email messages include a misspelled email address, a nonexistent email address, or a full recipient inbox. A repeat bounce is when an address has bounced, then bounced a second time and logged to the bounce suppression list, but you ask us to send to this recipient again. Our system will suppress the message, because it ‘knows’ that recipient address is bad. +A bounce occurs when a sent message is rejected by the receiving mail server. The most common causes for bounced email messages include a misspelled or nonexistent email address. A repeat bounce is when an address has bounced, then bounced a second time and logged to the bounce suppression list, but you ask us to send to this recipient again. Our system will suppress the message, because it ‘knows’ that recipient address is bad. {% anchor h2 %} Bounce Notifications {% endanchor %} -If you would like to recieve a notification for each bounce message, you can turn on Bounce Forwarding in your Mail Settings. +If you would like to receive a notification for each bounce message, you can turn on Bounce Forwarding in your Mail Settings. {% anchor h2 %} Searching Bounces by Date @@ -37,7 +37,9 @@ Removing Recipients From The List When you select the checkboxes next to the recipient names or select all, using the checkbox next to the search box, you will see a new button at the top of the page. From this list, you can choose to remove the selected recipients from the list. You can also use the Bounce Purge. {% anchor h2 %} -Related +Additional Resources {% endanchor %} -[Set up Bounce Forwarding to go to the email’s from address]({{site.support_url}}/hc/en-us/articles/200181478) +- [Set up Bounce Forwarding to go to the email’s from address]({{site.support_url}}/hc/en-us/articles/200181478) +- [Global Unsubscribes]({{root_url}}/User_Guide/Suppressions/global_unsubscribes.html) +- [Group Unsubscribes]({{site.app_url}}/suppressions/group_unsubscribes) diff --git a/source/User_Guide/Suppressions/global_unsubscribes.md b/source/User_Guide/Suppressions/global_unsubscribes.md index 4d30ba1688..f6aa8131f1 100644 --- a/source/User_Guide/Suppressions/global_unsubscribes.md +++ b/source/User_Guide/Suppressions/global_unsubscribes.md @@ -39,7 +39,7 @@ When you add the `<%asm_global_unsubscribe_url%>` tag to your email, we will rep Alternatively, you can use the `<%asm_global_unsubscribe_raw_url%>` tag, which will be replaced with only the global unsubscribe URL without the hyperlinked text "Unsubscribe From All Emails". -For more substitution tags, please see our [transactional templates]({{root_url}}/User_Guide/Transactional_Templates/create_edit.html#-Unsubscribe-Substitution-Tags). +For more substitution tags, please see our [transactional templates]({{root_url}}/User_Guide/Transactional_Templates/create_and_edit_transactional_templates.html#-Adding-unsubscribe-links-to-a-template). {% anchor h2 %} Using the API @@ -48,7 +48,9 @@ Using the API You can manage your Global Unsubscribes via the [Global Suppressions API]({{root_url}}/API_Reference/Web_API_v3/Suppression_Management/global_suppressions.html). {% anchor h2 %} -Related +Additional Resources {% endanchor %} -[Global unsubscribes vs. Group Unsubscribes]({{root_url}}/User_Guide/Email_Deliverability/Subscription_Tracking/suppressions_vs_unsubscribes.html). +- [Global unsubscribes vs. Group Unsubscribes]({{root_url}}/User_Guide/Email_Deliverability/Subscription_Tracking/suppressions_vs_unsubscribes.html) +- [Group Unsubscribes]({{root_url}}/User_Guide/Suppressions/group_unsubscribes.html) +- [Invalid Emails]({{root_url}}/User_Guide/Suppressions/invalid_emails.html) diff --git a/source/User_Guide/Suppressions/group_unsubscribes.md b/source/User_Guide/Suppressions/group_unsubscribes.md index a1f4f9912a..1c8632986b 100644 --- a/source/User_Guide/Suppressions/group_unsubscribes.md +++ b/source/User_Guide/Suppressions/group_unsubscribes.md @@ -10,7 +10,7 @@ navigation: show: true --- -A group unsubscribe happens when a recipient indicates that they would like to opt out from a specific type of email that you send via the [Unsubscribe Groups link]({{root_url}}/User_Guide/Suppressions/group_unsubscribes.html#-Group-Unsubscribe-Substitution-Tag) from within your email. The list provided here can be filtered by email address or date. +A group unsubscribe happens when a recipient indicates that they would like to opt out from a specific type of email that you send via the [Unsubscribe Groups link]({{root_url}}/User_Guide/Suppressions/group_unsubscribes.html#-Group-Unsubscribe-Substitution-Tag) from within your email. The list provided here can be filtered by email address or date. {% anchor h2 %} Searching Group Unsubscribes by Date @@ -38,7 +38,7 @@ When you add the `<%asm_group_unsubscribe_url%>` tag to your email, we will repl Alternatively, you can use the `<%asm_group_unsubscribe_raw_url%>` tag which will be replaced with only the group unsubscribe URL without the hyperlinked text "Unsubscribe From This List". -For more substitution tags, please see our [transactional templates]({{root_url}}/User_Guide/Transactional_Templates/create_edit.html#-Unsubscribe-Substitution-Tags). +For more substitution tags, please see our [transactional templates]({{root_url}}/User_Guide/Transactional_Templates/create_and_edit_transactional_templates.html#-Adding-unsubscribe-links-to-a-template). {% anchor h2 %} Using the API @@ -47,7 +47,9 @@ Using the API You can manage your Global Unsubscribes via the [Group Suppressions API]({{root_url}}/API_Reference/Web_API_v3/Suppression_Management/groups.html). {% anchor h2 %} -Related +Additional Resources {% endanchor %} -[Global unsubscribes vs. Group Unsubscribes]({{root_url}}/User_Guide/Email_Deliverability/Subscription_Tracking/suppressions_vs_unsubscribes.html). +- [Global unsubscribes vs. Group Unsubscribes]({{root_url}}/User_Guide/Email_Deliverability/Subscription_Tracking/suppressions_vs_unsubscribes.html) +- [Global Unsubscribes]({{root_url}}/User_Guide/Suppressions/global_unsubscribes.html) +- [Invalid Emails]({{root_url}}/User_Guide/Suppressions/invalid_emails.html) diff --git a/source/User_Guide/Suppressions/index.html b/source/User_Guide/Suppressions/index.html index d5328b5c88..3e8ec03cbf 100644 --- a/source/User_Guide/Suppressions/index.html +++ b/source/User_Guide/Suppressions/index.html @@ -1,7 +1,7 @@ --- layout: page weight: 100 -title: Overview +title: Suppressions Overview seo: title: SendGrid Suppressions Overview description: SendGrid will suppress emails that your recipients unsubscribe from or that recipient email servers reject. @@ -9,6 +9,11 @@ navigation: show: true --- + {% anchor h2 %} Suppressions vs. Unsubscribes @@ -24,7 +29,7 @@ {% warning %} Each email you send to a suppressed address will consume one email from your account. {% endwarning %} - + {% anchor h2 %} Managing Unsubscribes {% endanchor %} @@ -62,3 +67,13 @@

    Group Unsubscribes - When a user unsubscribes from a specific group of your emails.

    + +{% anchor h2 %} +Additional Resources +{% endanchor %} + + diff --git a/source/User_Guide/Suppressions/invalid_emails.md b/source/User_Guide/Suppressions/invalid_emails.md index f54c59636c..5205092049 100644 --- a/source/User_Guide/Suppressions/invalid_emails.md +++ b/source/User_Guide/Suppressions/invalid_emails.md @@ -12,6 +12,8 @@ navigation: An invalid email occurs when you attempt to send email to an address that is formatted in a manner that does not meet internet email format standards or the email does not exist at the recipient's mail server. Examples include addresses without the “@” sign or addresses that include certain special characters and/or spaces. This response can come from our own server or the recipient mail server. +Before you send, SendGrid does a check against the format of the email address to attempt to verify its validity. If the recipient server checks the address and doesn't find it, they will send back a 550 bounce to say that this is an invalid email address. + The list provided here can be filtered by email address or date. {% anchor h2 %} @@ -31,3 +33,11 @@ Download Invalid Emails as CSV {% endanchor %} You can download your list as a CSV by clicking the gear icon at the top of the page and selecting “Download CSV.” The file will download in your browser right away. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Recipient Subscription Preferences]({{root_url}}/User_Guide/Suppressions/recipient_subscription_preferences.html) +- [Spam Reports]({{root_url}}/User_Guide/Suppressions/spam_reports.html) +- [Invalid Emails API]({{root_url}}/API_Reference/Web_API_v3/invalid_emails.html) diff --git a/source/User_Guide/Suppressions/recipient_subscription_preferences.md b/source/User_Guide/Suppressions/recipient_subscription_preferences.md index 2fcd64c2cd..fd80bf5ebb 100644 --- a/source/User_Guide/Suppressions/recipient_subscription_preferences.md +++ b/source/User_Guide/Suppressions/recipient_subscription_preferences.md @@ -34,4 +34,10 @@ You can also choose to manually add the `<%asm_preferences_url%>` tag to your em Alternatively, you can use the `<%asm_preferences_raw_url%>` substitution tag. This will be replaced with just the URL pointing to your [Subscription Preference page]({{root_url}}/User_Guide/Suppressions/recipient_subscription_preferences.html) without the hyperlinked text "Manage Email Preferences". -For more substitution tags, please see our [transactional templates]({{root_url}}/User_Guide/Transactional_Templates/create_edit.html#-Unsubscribe-Substitution-Tags). +For more substitution tags, please see our [transactional templates]({{root_url}}/User_Guide/Transactional_Templates/create_and_edit_transactional_templates.html#-Adding-unsubscribe-links-to-a-template). + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Spam Reports]({{root_url}}/User_Guide/Suppressions/spam_reports.html) diff --git a/source/User_Guide/Suppressions/spam_reports.md b/source/User_Guide/Suppressions/spam_reports.md index 55e8329353..ccfc7cd84e 100644 --- a/source/User_Guide/Suppressions/spam_reports.md +++ b/source/User_Guide/Suppressions/spam_reports.md @@ -28,3 +28,10 @@ When you select the checkboxes next to the recipient names or select all, using Download Spam Reports as CSV {% endanchor %} You can download your Global Unsubscribe list as a CSV by clicking the gear icon at the top of the page and selecting “Download CSV.” The file will download in your browser right away. + +{% anchor h2 %} +Additional Resources +{% endanchor %} + +- [Spam Reports API]({{root_url}}/API_Reference/Web_API_v3/spam_reports.html) +- [Invalid Emails API]({{root_url}}/API_Reference/Web_API_v3/invalid_emails.html) diff --git a/source/User_Guide/Transactional_Email/index.html b/source/User_Guide/Transactional_Email/index.html index 4b8a5d0c47..721cdb441f 100644 --- a/source/User_Guide/Transactional_Email/index.html +++ b/source/User_Guide/Transactional_Email/index.html @@ -21,11 +21,10 @@ {% anchor h2 %} Tools you can use: -{% endanchor %} +{% endanchor h2 %} - diff --git a/source/User_Guide/Transactional_Email/unsubscribes.md b/source/User_Guide/Transactional_Email/unsubscribes.md index c35d61621b..b9fcab546d 100644 --- a/source/User_Guide/Transactional_Email/unsubscribes.md +++ b/source/User_Guide/Transactional_Email/unsubscribes.md @@ -11,3 +11,11 @@ navigation: If you are sending email through SendGrid and have the [Subscription Tracking Setting]({{root_url}}/User_Guide/Settings/tracking.html) turned on, an unsubscribe option will be added to the footer of every email that gets sent through your account. A user who clicks the unsubscribe link will be added to your [global unsubscribe list]({{site.app_url}}/suppressions/global_unsubscribes) and **any** future attempts to send email to those users will be suppressed unless they’re removed. You can also manage this list manually, adding and removing addresses via the UI or with the use of [API calls]({{root_url}}/API_Reference/Web_API/unsubscribes.html). The [Subscription Tracking Setting]({{root_url}}/User_Guide/Settings/tracking.html) also has a number of options for customization, such as a replacement tag that allows you to place the unsubscribe text somewhere in the body of the email, the ability to reword the unsubscribe message, and the ability to add a custom landing page. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Transactional Email](https://sendgrid.com/docs/User_Guide/Transactional_Email/index.html) +- [Transactional Templates Overview](https://sendgrid.com/docs/User_Guide/Transactional_Templates/index.html) +- [Tracking](https://sendgrid.com/docs/User_Guide/Settings/tracking.html) \ No newline at end of file diff --git a/source/User_Guide/Transactional_Templates/Create_and_edit_dynamic_transactional_templates.md b/source/User_Guide/Transactional_Templates/Create_and_edit_dynamic_transactional_templates.md new file mode 100644 index 0000000000..57a0e16e0d --- /dev/null +++ b/source/User_Guide/Transactional_Templates/Create_and_edit_dynamic_transactional_templates.md @@ -0,0 +1,151 @@ +--- +layout: page +weight: 50 +title: Create and edit Dynamic Transactional Templates +navigation: + show: true +seo: + title: Create and edit Dynamic Transactional Templates + override: true + description: Transactional email templates are pre-coded email layouts that anyone can use to easily create and send transactional emails. + keywords: transactional email templates, email template, template engine +--- +- [Create a template](#-Create-a-template) +- [Editing your HTML template](#-Editing-your-HTML-template) + - [Using the Design Editor](#-Using-the-Design-Editor) + - [Using the Code Editor](#-Using-the-Code-Editor) +- [Preview and test your template](#-Preview-and-test-your-template) +- [Activate your template](#-Activate-your-template) + +{% info %} +The maximum number of transactional templates and versions per user ID is limited to 300. This means you can have 300 templates with 1 version each, or fewer templates with more versions of each template. +{% endinfo %} + +{% info %} +Transactional templates are account and subuser specific. Templates created on a parent account will not be accessible from the subuser accounts. +{% endinfo %} + +{% anchor h2 %} +Create a template +{% endanchor h2 %} + +1. Open the [Transactional Templates](https://sendgrid.com/dynamic_templates) page and click **Create Template**. +1. Add a unique template name in the dialogue box and then click **Save**. +1. Click **Add Version**. +1. Select the editor you want to use to build your template. + +The Code Editor is perfect for users who are creating or editing custom HTML. It offers a robust environment to upload images, backed by a feature-packed editor – complete with split-screen preview, error flagging, scroll-syncing, syntax highlighting and more. + +The Design Editor, complete with HTML access to each content module, offers powerful “what you see is what you get” (WYSIWYG) editing. It features a diverse library of content blocks, allowing you to build beautiful templates quickly and intuitively. Once placed into your template, each module offers access to edit the HTML and a robust panel of settings – perfect for customizing content precisely to your needs. + +{% anchor h2 %} +Editing your HTML template +{% endanchor h2 %} + +{% info %} +Email templates are table-based HTML with inline or header styles, because some well-known email applications will only read table-based HTML. +{% endinfo %} + +The easiest way to get started with a new template is to use one of your previous email templates or a free template from the internet, and then modify it to fit your needs. + +{% anchor h3 %} +Using the Code Editor +{% endanchor %} + +*To edit a template using the Code Editor:* + +1. If you selected the Code Editor, copy and paste your HTML code into the code editor. +

    If you paste in an email template, it is likely that you will overwrite the default and very basic email HTML that is provided in the code editor. +2. To add an image to your template, select the **images** icon above the HTML code. +3. Select the image you want to add from your image library. To add more images to your library, drag them into the box at the top of the library or click **choose images to upload**. +4. Select the **Image Details** tab and copy the URL in the *Image Source URL* tab by clicking **Copy URL**. +5. Paste this URL in an image source tag in your campaign or template's HTML. +Example: `` +6. When you’re done editing, click **Save**.

    Please double check that the content is formatted correctly before you send an email using this template. + +{% anchor h3 %} +Using the Design Editor +{% endanchor %} + +*To edit a template using the Design Editor:* + +{% anchor h2 %} +Preview and test your template +{% endanchor h2 %} + +SendGrid suggests previewing and testing your template once you have created it to ensure that the format and layout look the way you expect. + +*To preview your template:* + +1. Select **Preview**.

    A window pops out with a preview of the email that you’re going to test, with the option to view the template formatted for both mobile and desktop platforms. +1. Click **Send Test** to send a test email using your new template. +1. Fill in the *recipient* and *subject line* fields and then click **Send**. +Any Substitution tags will not be populated in this test, but you will be able to confirm the layout and format of your template. + +{% anchor h2 %} +Activate your template +{% endanchor h2 %} + +*To activate your template:* + +1. Navigate to the template you wish to use and select the action menu. +1. Select **Make Active**. + +{% info %} + +A template can only have one active version at a time. If you’ve created a new version with different HTML that you want your customers to start receiving, you’ll need to make that version “Active.” + +{% endinfo %} + +{% anchor h2 %} +Duplicate a Template +{% endanchor h2 %} + +*To duplicate a template:* + +1. Navigate to the template you wish to use and select the action menu. +1. Select **Duplicate**. + +This creates a clone, giving it a name that includes the original version name, the word “copy,” and today’s date. This duplicate version will not be active until you activate it. + +{% anchor h2 %} +Unsubscribe Substitution Tags +{% endanchor h2 %} + +You can use [substitution tags]({{root_url}}/API_Reference/SMTP_API/substitution_tags.html) to add links to your email to allow recipients to unsubscribe from only these emails, from all of your emails, and to manage their unsubscribe settings for your emails. + +{% warning %} +When using the group unsubscribe substitution tag, you must specify which unsubscribe group you would like to use. If you are sending your email via our SMTP API, please add the group ID into the X-SMTPAPI header. If you are sending via our Web API, please enter the group ID into the x-smtpapi parameter of the mail. Send API call. + +You must also specify which unsubscribe groups to include on the Manage Preferences page if you are using the Manage Email Preferences substitution tag. For more detailed information, please visit our [API Reference]({{root_url}}/API_Reference/SMTP_API/suppressions.html). +{% endwarning %} + +{% info %} +You can find your group IDs by looking at the Group ID column in the [Unsubscribe Groups UI]({{site.app_url}}/suppressions/advanced_suppression_manager), or by calling the [GET method]({{root_url}}/API_Reference/Web_API_v3/Suppression_Management/groups.html#-GET) of the groups resource. +{% endinfo %} + +{% anchor h3 %} +Unsubscribe From This List +{% endanchor h3 %} + +When you add the ```<%asm_group_unsubscribe_url%>``` tag to your email, we will replace that tag with the text "Unsubscribe From This List," wherever the tag is found in your email. This link will allow your recipients to unsubscribe from the [unsubscribe group]({{root_url}}/User_Guide/Suppressions/group_unsubscribes.html) that you attached to this email. + +{% anchor h3 %} +Unsubscribe From All Emails +{% endanchor h3 %} + +When you add the ```<%asm_global_unsubscribe_url%>``` tag to your email, we will replace that tag with the text "Unsubscribe From All Emails," wherever the tag is found in your email. This will allow your recipient to be [globally unsubscribed]({{root_url}}/User_Guide/Suppressions/global_unsubscribes.html) from all of your emails. + +{% anchor h3 %} +Manage Email Preferences +{% endanchor h3 %} + +When you add the ```<%asm_preferences_url%>``` tag to your email, we will replace that tag with the text "Manage Email Preferences," wherever the tag is found in your email. This will allow your recipients to see your Unsubscribe Groups in a [Subscription Preference page]({{root_url}}/User_Guide/Suppressions/recipient_subscription_preferences.html) and then choose which groups they are interested in. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Transactional Templates Overview]({{root_url}}/User_Guide/Transactional_Templates/index.html) +- [Manage Templates](https://sendgrid.com/docs/User_Guide/Transactional_Templates/manage.html) +- [Transactional Email Unsubscribes]({{root_url}}/User_Guide/Transactional_Email/unsubscribes.html) diff --git a/source/User_Guide/Transactional_Templates/Using_handlebars.md b/source/User_Guide/Transactional_Templates/Using_handlebars.md new file mode 100644 index 0000000000..2da3228fb7 --- /dev/null +++ b/source/User_Guide/Transactional_Templates/Using_handlebars.md @@ -0,0 +1,535 @@ +--- +layout: page +weight: 50 +title: Using Handlebars +navigation: + show: true +seo: + title: Using Handlebars + override: true + description: +--- + +- [Handlebars overview](#-Handlebars-overview) +- [Personalizing email with Handlebars](#-Personalizing-email-with-Handlebars) +- [Use cases](#-Use-cases) + - [Receipts](#-Receipts) + - [Password reset](#-Password-reset) + - [Muliple languages](#-Muliple-languages) + - [Newsletter](#-Newsletter) + - [Advertisement](#-Advertisement) +- [Handlebar.js reference](#-Handlebar.js-reference) + - [Substitution](#-Substitution) + - [Conditional statements](#-Conditional-statements) + - [Iterations](#-Iterations) + - [Unless](#-Unless) + - [Combined examples](#-Combined-examples) + +{% anchor h2 %} +Handlebars overview +{% endanchor %} + +[Handlebars.js syntax](https://handlebarsjs.com/) provides a simple, powerful way to include dynamic content, directly within email templates. Handlebars.js syntax allows all of this dynamic templating to occur outside of code, meaning changes are done quickly in the template, with no update to a code base required. + +This page uses examples from the [dynamic-template section of our email templates github repo](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates). + +{% info %} +For the full API documentation, see [Mail Send with Dynamic Transactional Templates](https://dynamic-templates.api-docs.io/3.0). +{% endinfo %} + +{% anchor h2 %} +Personalizing email with Handlebars +{% endanchor %} + +We do not support full Handlebars.js functionality. Currently, dynamic templates supports the following helpers: + + - [Substitution](#-Substitution) + - [Conditional statements](#-Conditional-statements) (including `if/else` and `unless`) + - [Iterations](#-Iterations) + +For a full helper reference, with examples, see the [Handlebar.js reference](#-Handlebar.js-reference). This page has use cases with examples that include the supported helpers. + +{% anchor h2 %} +Use cases +{% endanchor %} + +Here are example use cases listed with the Handlebars.js helpers used to build the example templates. + +{% anchor h3 %} +Receipts +{% endanchor %} + +This is an [example receipt template](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/receipt). + +This reciept template is using these helpers: + + - [Substitution](#-Substitution) + - [Conditional statements](#-Conditional-statements) + - [Iterations](#-Iterations) + +{% anchor h3 %} +Password reset +{% endanchor %} + +This is an [example transactional template](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/transactional-actions). + +This transactional template is using this helper: + +- [Substitution](#-Substitution) + +{% anchor h3 %} +Muliple languages +{% endanchor %} + +This is an [example template that lets you have content in multiple languages](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/different-languages). + +This reciept template is using this helper: + +- [Conditional statements](#-Conditional-statements) - `if/else` + +{% anchor h3 %} +Newsletter +{% endanchor %} + +This is an [example newsletter template](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/newsletter). + +This reciept template is using these helpers: + + - [Substitution](#-Substitution) + - [Iterations](#-Iterations) + +{% anchor h3 %} +Advertisement +{% endanchor %} + +This is an [example template that is advertising items on sale](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/special-sale). + +This reciept template is using these helpers: + + - [Substitution](#-Substitution) + - [Conditional statements](#-Conditional-statements) - `if/else` + - [Iterations](#-Iterations) + +{% anchor h2 %} +Handlebar.js reference +{% endanchor %} + +This reference goes through examples of each helper - including HTML email snippits, and JSON test data. + +{% anchor h3 %} +Substitution +{% endanchor %} + +There are four main types of substitutions: + +- [Basic replacement](#-Basic-replacement) +- [Text only replacement](#-Text-only-replacement) +- [Deep object replacement](#-Deep-object-replacement) +- [Object failure](#-Object-failure) +- [Replacement with HTML](#-Replacement-with-HTML) + +{% anchor h4 %} +Basic replacement +{% endanchor %} + +HTML should contain: +{% codeblock %} +{% raw %}

    Hello {{firstName}}

    {% endraw %} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +{"firstName":"Ben"} +{% endcodeblock %} + +Resulting replacement: +{% codeblock %} +{% raw %}

    Hello Ben

    {% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +Text only replacement +{% endanchor %} + +This is useful for subject line replacement, as the subject line doesn't process HTML encoding (i.e. an apostrophe would encode as '). + +Subject line should contain: +{% codeblock %} +{% raw %}{{{subject}}}{% endraw %} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +{"subject":"James' Artisanal \"Cheeses\""} +{% endcodeblock %} + +Resulting subject line replacement: +{% codeblock %} +{% raw %}James' Artisanal "Cheeses"{% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +Deep object replacement +{% endanchor %} + +HTML should contain: +{% codeblock %} +{% raw %}

    Hello {{user.profile.firstName}}

    {% endraw %} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +{ + "user":{ + "profile":{ + "firstName":"Ben" + } + } +} +{% endcodeblock %} + +Resulting replacement: +{% codeblock %} +{% raw %}

    Hello Ben

    {% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +Object failure +{% endanchor %} + +HTML should contain: +{% codeblock %} +{% raw %}

    Hello {{user.profile.firstName}}

    {% endraw %} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +{ + "user":{ + "orderHistory":[ + { + "date":"2/1/2018", + "item":"shoes" + }, + { + "date":"1/4/2017", + "item":"hat" + } + ] + } +} +{% endcodeblock %} + +Resulting replacement: +{% codeblock %} +{% raw %}

    Hello

    {% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +Replacement with HTML +{% endanchor %} + +HTML should contain: +{% codeblock %} +{% raw %}

    Hello {{{firstName}}}

    {% endraw %} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +{% raw %}{"firstName":"Ben"}{% endraw %} +{% endcodeblock %} + +Resulting replacement: +{% codeblock %} +{% raw %}

    Hello Ben

    {% endraw %} +{% endcodeblock %} + +{% anchor h3 %} +Conditional statements +{% endanchor %} + +Here are three types of conditonal statements: + +- [Basic If, Else, Else If](#-Basic-If--Else-Else-If) +- [If with a root](#-If-with-a-root) +- [Unless](#-Unless) + +{% anchor h4 %} +Basic If, Else, Else If +{% endanchor %} + +HTML should contain: +{% codeblock %} +{% raw %}{{#if user.profile.male}} +

    Dear Sir

    +{{else if user.profile.female}} +

    Dear Madame

    +{{else}} +

    Dear Customer

    +{{/if}}{% endraw %} +{% endcodeblock %} + +Test Data should contain: +###1 +{% codeblock %} +{ + "user":{ + "profile":{ + "male":"true" + } + } +} +{% endcodeblock %} + +###2 +{% codeblock %} +{ + "user":{ + "profile":{ + "female":true + } + } +} +{% endcodeblock %} + +###3 +{% codeblock %} +{ + "user":{ + "profile":{ + + } + } +} +{% endcodeblock %} + +Resulting replacement: +###1 +{% codeblock %} +{% raw %}

    Dear Sir

    {% endraw %} +{% endcodeblock %} + +###2 +{% codeblock %} +{% raw %}

    Dear Madame

    {% endraw %} +{% endcodeblock %} + +###3 +{% codeblock %} +{% raw %}

    Dear Customer

    {% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +If with a root +{% endanchor %} + +HTML should contain: +{% codeblock %} +{% raw %}{{#if user.suspended}} +

    Warning! Your account is suspended, please call: {{@root.supportPhone}}

    +{{/if}}{% endraw %} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +{ + "user":{ + "suspended":true + }, + "supportPhone":"1-800-1234567" +} +{% endcodeblock %} + +Resulting replacement: +{% codeblock %} +{% raw %}

    Warning! Your account is suspended, please call: 1-800-1234567

    {% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +Unless +{% endanchor %} + +HTML should contain: +{% codeblock %} +{{#unless user.active}} +

    Warning! Your account is suspended, please call: {{@root.supportPhone}}

    +{{/unless}} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +{ + "user":{ + "active":false + }, + "supportPhone":"1-800-1234567" +} +{% endcodeblock %} + + +{% anchor h3 %} +Iterations +{% endanchor %} + +{% anchor h4 %} +Basic Iterator +{% endanchor %} + +HTML should contain: +{% codeblock %} +{% raw %}
      +{{#each user.orderHistory}} +
    1. You ordered: {{this.item}} on: {{this.date}}
    2. +{{/each}} +
    {% endraw %} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +{ + "user":{ + "orderHistory":[ + { + "date":"2/1/2018", + "item":"shoes" + }, + { + "date":"1/4/2017", + "item":"hat" + } + ] + } +} +{% endcodeblock %} + +Resulting replacement: +{% codeblock %} +{% raw %}
      +
    1. You ordered: shoes on: 2/1/2018
    2. +
    3. You ordered: hat on: 1/42017
    4. +
    {% endraw %} +{% endcodeblock %} + +{% anchor h3 %} +Combined examples +{% endanchor %} + +Here are two combined examples: + +- [Dynamic content creation](#-Dynamic-content-creation) +- [Dynamic content creation with dynamic parts](#-Dynamic-content-creation-with-dynamic-parts) + +{% anchor h4 %} +Dynamic content creation +{% endanchor %} + +HTML should contain: +{% codeblock %}{% raw %} +{{#each user.story}} + {{#if this.male}} +

    {{this.date}}

    + {{else if this.female}} +

    {{this.item}}

    + {{/if}} +{{/each}}{% endraw %} +{% endcodeblock %} + + +Test Data should contain: +{% codeblock %} +{ + "user":{ + "story":[ + { + "male":true, + "date":"2/1/2018", + "item":"shoes" + }, + { + "male":true, + "date":"1/4/2017", + "item":"hat" + }, + { + "female":true, + "date":"1/1/2016", + "item":"shirt" + } + ] + } +} +{% endcodeblock %} + +Resulting replacement: +{% codeblock %}{% raw %} +

    2/1/2018

    +

    1/4/2017

    +

    shirt

    {% endraw %} +{% endcodeblock %} + +{% anchor h4 %} +Dynamic content creation with dynamic parts +{% endanchor %} + +HTML should contain: +{% codeblock %}{% raw %} +{{#each user.story}} + {{#if this.male}} + {{#if this.date}} +

    {{this.date}}

    + {{/if}} + {{#if this.item}} +

    {{this.item}}

    + {{/if}} + {{else if this.female}} + {{#if this.date}} +

    {{this.date}}

    + {{/if}} + {{#if this.item}} +

    {{this.item}}

    + {{/if}} + {{/if}} +{{/each}}{% endraw %} +{% endcodeblock %} + +Test Data should contain: +{% codeblock %} +16 +May 11th 2018, 2:18:20 pm +{ + "user":{ + "story":[ + { + "male":true, + "date":"2/1/2018", + "item":"shoes" + }, + { + "male":true, + "date":"1/4/2017" + }, + { + "female":true, + "item":"shirt" + } + ] + } +} +{% endcodeblock %} + +Resulting replacement: +{% codeblock %}{% raw %} +

    2/1/2018

    +

    shoes

    +

    1/4/2017

    +

    shirt

    {% endraw %} +{% endcodeblock %} + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Transactional Templates Overview]({{root_url}}/User_Guide/Transactional_Templates/index.html) +- [Create and edit Dynamic Transactional Templates]() +- [Mail Send with Dynamic Transactional Templates](https://dynamic-templates.api-docs.io/3.0) +- [How to send an email with dynamic templates]({{root_url}}/User_Guide/Transactional_Templates/how_to_send_an_email_with_transactional_templates.html) diff --git a/source/User_Guide/Transactional_Templates/create_and_edit_transactional_templates.md b/source/User_Guide/Transactional_Templates/create_and_edit_transactional_templates.md new file mode 100644 index 0000000000..83c0ad83c3 --- /dev/null +++ b/source/User_Guide/Transactional_Templates/create_and_edit_transactional_templates.md @@ -0,0 +1,122 @@ +--- +title: Create and Edit Transactional Templates +seo: + title: Create and Edit Templates + description: Transactional email templates are pre-coded email layouts that anyone can use to easily create and send transactional emails. + keywords: transactional email templates, email template, create templates +weight: 80 +layout: page +navigation: + show: true +--- + +- [Creating a template](#-Create-a-template) +- [Editing your HTML template](#-Editing-your-HTML-template) +- [Preview and test your template](#-Preview-and-test-your-template) +- [Managing templates](#-Managing-templates) + - [Activate your template](#-Activate-your-template) + - [Duplicate a template](#-Duplicate-a-template) +- [Adding unsubscribe links to a template](#-Adding-unsubscribe-links-to-a-template) + +Creating email templates involves a mix of content writing, HTML, and CSS expertise. Email templates should look good on different email clients and be responsive for mobile devices. Many non-technical customers will hire a front-end or email template developer to build their templates. We also suggest testing your templates with rendering applications like [Litmus](http://litmus.com) before sending them to your customers. + +{% info %} +The maximum number of transactional templates and versions per user ID is limited to 300. This means you can have 300 templates with 1 version each, or fewer templates with more versions of each template. +{% endinfo %} + +{% info %} +Transactional templates are account and subuser specific. Templates created on a parent account will not be accessible from the subuser accounts. +{% endinfo %} + +{% anchor h2 %} +Creating a template +{% endanchor h2 %} + +1. Open the transactional templates page and then click **Create Template**. +1. Add a unique template name in the dialogue box and then click **Save**. +1. Open the **Actions** drop-down menu to create a new version. +1. Click **Add Version**. +

    The editor opens. From here, you can change the subject and the body of your email template. + +The easiest way to get started with a new template is to use one of your previous email templates or a free template from the internet, and then modify it to fit your needs. + +{% anchor h2 %} +Editing your HTML template +{% endanchor h2 %} + +{% info %} +Email templates are table-based HTML with inline or header styles, because some well known email applications will only read table-based HTML. +{% endinfo %} + +*To add a template:* + +1. Open a new template in the Code Editor or [Design Editor]({{root_url}}/User_Guide/Marketing_Campaigns/design_editor.html) by clicking **Actions** and selecting **New Version**. + +1. If you selected the Code Editor, copy and paste your HTML code into the code editor. +

    If you paste in an email template, it is likely that you will overwrite the default basic HTML provided in the code editor. If you selected the Design Editor, use the WYSIWYG editor with drag & drop modules to create your email template. + +1. When you’re done editing, click **Save**.

    Please double check that the content is formatted correctly before you send an email using this template. + +{% anchor h2 %} +Preview and test your template +{% endanchor h2 %} + +SendGrid suggests previewing and testing your template once you have created it to ensure that the format and layout look the way you expect. + +*To preview your template:* + +1. Select **Preview**.

    A window pops out with a preview of the email that you’re going to test, with the option to view the template formatted for both mobile and desktop platforms. + +1. Click **Send Test** to send a test email using your new template. +1. Fill in the *recipient* and *subject line* fields and then click **Send**. + +Any Substitution tags will not be populated in this test, but you will be able to confirm the layout and format of your template. + +{% anchor h2 %} +Managing templates +{% endanchor %} + +From the main template view on each template group, you will see an actions menu. From this menu, you can choose to edit the name of your template, add a version, preview and test, or delete the template. You will also see a gear icon for each template version. Clicking this presents a menu that allows you to preview and test, edit, duplicate, and delete the template version. You can also use the preview function to send a test. + +{% info %} +To delete a template, you must first delete all the versions of your template. +{% endinfo %} + +{% anchor h3 %} +Activate your template +{% endanchor h2 %} + +*To activate your template:* + +1. Navigate to the template you wish to use and select the action menu. +1. Select **Make Active**. + +{% info %} +A template can only have one active version at a time. If you’ve created a new version with different HTML that you want your customers to start receiving, you’ll need to make that version “Active.” +{% endinfo %} + +{% anchor h3 %} +Duplicate a Template +{% endanchor h2 %} + +*To duplicate a template:* + +1. Navigate to the template you wish to use and select the action menu. +1. Select **Add Version**. + +The app creates a clone, giving it a name that starts with "untitled". You can give the template a unique name by selecting the action menu next to that version and clicking **Edit**. Once the editor has opened, enter a unique name in the *Template Name* field. This duplicate version will not be active until you activate it. + + +{% anchor h2 %} +Adding unsubscribe links to a template +{% endanchor h2 %} + +For more information about unsubscribes, check out our [unsubscribe documentation]({{root_url}}/User_Guide/Transactional_Email/unsubscribes.html). + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Transactional Templates Overview](https://sendgrid.com/docs/User_Guide/Transactional_Templates/index.html) +- [Manage Templates](https://sendgrid.com/docs/User_Guide/Transactional_Templates/manage.html) +- [Transactional Email Unsubscribes]({{root_url}}/User_Guide/Transactional_Email/unsubscribes.html) diff --git a/source/User_Guide/Transactional_Templates/create_edit.md b/source/User_Guide/Transactional_Templates/create_edit.md deleted file mode 100644 index 7565854651..0000000000 --- a/source/User_Guide/Transactional_Templates/create_edit.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -title: Create and Edit Templates -seo: - title: Create and Edit Templates -weight: 10 -layout: page -navigation: - show: true ---- - -Creating email templates involves a mix of content writing, HTML, and CSS expertise. Email templates should look good on different email clients and be responsive for mobile devices. Many non-technical customers will hire a front end or email template developer to build their templates. We also suggest testing your templates with rendering applications like [Litmus](http://litmus.com) before sending them to your customers. - -{% info %} -There is currently a limit of 300 templates and 300 versions that may be created per account. -{% endinfo %} - -{% info %} -Transactional templates are account and subuser specific. Templates created on a parent account will not be accessible from the subuser accounts. -{% endinfo %} - -{% anchor h2 %} -Create a Template -{% endanchor %} - -When you first visit the transactional templates page, you will be asked to create your first template. - -![](/images/templates_create_edit_1.png "Add a Template") - -Click “Create Template” and you’ll be asked to add a Template Name. - -![](/images/templates_create_edit_2.png "Template Name") - -When you hit save, your new template group will be created. - -![](/images/templates_create_edit_3.png "Template Group") - -You can then open the actions dropdown menu to create a new version. - -![](/images/templates_create_edit_4.png "Create Template Version") - -When you click Add Version, you will be taken to the editor. From here, you can change the subject and the body of your email template. - -The easiest way to get started with a new template is to use one of your previous email templates or a free template from the internet, and then modify it to fit your needs. - -{% anchor h2 %} -Editing Your HTML Template -{% endanchor %} - -{% info %} -Email templates are table-based HTML with inline or header styles, because some well-known email applications will only read table-based HTML. -{% endinfo %} - -To add a template, open a new template in the [Code Editor](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/code_editor.html). Copy and paste your HTML code into the dark-background code editor. - -If you paste in an email template, it is likely that you will overwrite the default and very basic email HTML that is provided in the code editor. - -When you’re done editing, click **Save** to keep all your changes. Please double check that the content is formatted correctly before you send an email using this template. - -{% info %} -You can also use the [Design Editor](https://sendgrid.com/docs/User_Guide/Marketing_Campaigns/design_editor.html) to create and edit templates. -{% endinfo %} - -{% anchor h2 %} -Preview and Test Your Template -{% endanchor %} - -We suggest that when you’re done making changes to your template, you preview and test it to ensure that the format and layout look the way you expect. We recommend that you always test your template before activating it. - -
    - -
    - When you select the “Preview” option, a sidebar window will pop out with a preview of the email that you’re going to test, with the option to view the template formatted for both mobile and desktop platforms. -
    -
    - You may send a test email using your new template from this window. -
    -
    - -
    -
    -
    - -![](/images/templates_create_edit_8.png "Preview and Test") - -If you click the Send Test button, you will be given the option of specifying the recipient, and subject line, of your test email. - -![](/images/templates_create_edit_9.png "Send Test") - -Your substitution tags will not be replaced in this test, but you will be able to confirm the layout and format of your template. - -{% anchor h2 %} -Activate Your Template -{% endanchor %} - -
    - -
    - A template can only have one active version at a time. If you’ve created a new version with different HTML that you want your customers to start receiving, you’ll need to make that Version “Active.” -
    -
    - Select the “Make Active” option from the gear icon menu. -
    -
    - -
    -
    -
    - -{% anchor h2 %} -Duplicate a Template -{% endanchor %} - -
    - -
    - -
    - -
    - When you’re ready to create a new version of your template, you can select the “Duplicate” option from the gear icon menu near the save button. -
    -
    - This creates a clone, giving it a name including the original version name, the word “clone,” and today’s date. This duplicate version will not be active until you activate it. -
    - -
    -
    - -{% anchor h2 %} -Unsubscribe Substitution Tags -{% endanchor %} - -You can use [substitution tags]({{root_url}}/API_Reference/SMTP_API/substitution_tags.html) to add links to your email to allow recipients to unsubscribe from only these emails, from all of your emails, and to manage their unsubscribe settings for your emails. - -{% warning %} -When using the group unsubscribe substitution tag, you must specify which unsubscribe group you would like to use. If you are sending your email via our SMTP API, please add the group ID into the X-SMTPAPI header. If you are sending via our Web API, please enter the group ID into the x-smtpapi parameter of the mail.send API call. - -You must also specify which unsubscribe groups to include on the Manage Preference page if you are using the Manage Email Preferences substitution tag. For more detailed information, please visit our [API Reference]({{root_url}}/API_Reference/SMTP_API/suppressions.html). -{% endwarning %} - -{% info %} -You can find your group IDs by looking at the Group ID column in the [Unsubscribe Groups UI]({{site.app_url}}/suppressions/advanced_suppression_manager), or by calling the [GET method]({{root_url}}/API_Reference/Web_API_v3/Suppression_Management/groups.html#-GET) of the groups resource. -{% endinfo %} - -{% anchor h3 %} -Unsubscribe From This List -{% endanchor %} - -When you add the ```<%asm_group_unsubscribe_url%>``` tag to your email, we will replace that tag with the text "Unsubscribe From This List," wherever the tag is found in your email. This link will allow your recipients to unsubscribe from the [unsubscribe group]({{root_url}}/User_Guide/Suppressions/group_unsubscribes.html) that you attached to this email. - -{% anchor h3 %} -Unsubscribe From All Emails -{% endanchor %} - -When you add the ```<%asm_global_unsubscribe_url%>``` tag to your email, we will replace that tag with the text "Unsubscribe From All Emails," wherever the tag is found in your email. This will allow your recipient to be [globally unsubscribed]({{root_url}}/User_Guide/Suppressions/global_unsubscribes.html) from all of your emails. - -{% anchor h3 %} -Manage Email Preferences -{% endanchor %} - -When you add the ```<%asm_preferences_url%>``` tag to your email, we will replace that tag with the text "Manage Email Preferences," wherever the tag is found in your email. This will allow your recipients to see your Unsubscribe Groups in a [Subscription Preference page]({{root_url}}/User_Guide/Suppressions/recipient_subscription_preferences.html) and then choose which groups they are interested in. diff --git a/source/User_Guide/Transactional_Templates/how_to_send_an_email_with_transactional_templates.md b/source/User_Guide/Transactional_Templates/how_to_send_an_email_with_transactional_templates.md new file mode 100644 index 0000000000..1437307279 --- /dev/null +++ b/source/User_Guide/Transactional_Templates/how_to_send_an_email_with_transactional_templates.md @@ -0,0 +1,155 @@ +--- +layout: page +weight: 100 +title: How to send an email with Dynamic Transactional Templates +navigation: + show: true +seo: + title: How to send an email with Dynamic Transactional Templates + override: true + description: +--- + +- [Before you begin](#-Before-you-begin) +- [Design a dynamic transactional template](#-Design-a-dynamic-template) +- [Send a transactional email](#-Send-a-transactional-email) + +{% anchor h2 %} +Before you begin +{% endanchor %} + +Before you create and send an email using a dynamic transactional template you need to do the following: + +* Create a SendGrid account +* Create an [API Key]({{root_url}}/User_Guide/Settings/api_keys.html) +* Add an [unsubscribe group]({{root_url}}/User_Guide/Transactional_Email/unsubscribes.html) (optional) + +{% anchor h2 %} +Design a dynamic transactional template +{% endanchor %} + +1. Open the [transactional templates](https://sendgrid.com/dynamic_templates) page and click **Create Template**. +1. Add a unique template name and then click **Save**. +1. To begin editing your new template, click **Add Version**. +1. Select an editor and click **Continue**. +1. Design your template. For more information on using Handlebars, see [Using handlebars]({{root_url}}/User_Guide/Transactional_Templates/Using_handlebars.html). + +For sample templates that that include examples of receipts, password resets, account activations, newsletters, and sale notifications, check out the [dynamic-template section of our email templates github repo](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates). + +The cURL calls on this page use the [receipt example template](https://github.com/sendgrid/email-templates/tree/master/dynamic-templates/receipt). + +{% info %} +For the full API documentation, see [Mail Send with Dynamic Transactional Templates](https://dynamic-templates.api-docs.io/3.0). +{% endinfo %} + +{% anchor h2 %} +Send a transactional email +{% endanchor %} + +*To send a dynamic transactional email:* + +In order to send a dynamic transactional email using cURL, set your call up to look something like this: + +{% codeblock %} +curl -X "POST" "https://api.sendgrid.com/v3/mail/send" \ + -H 'Authorization: Bearer <>' \ + -H 'Content-Type: application/json' \ + -d '{ + "from":{ + "email":"example@.sendgrid.net" + }, + "personalizations":[ + { + "to":[ + { + "email":"example@sendgrid.net" + } + ], + "dynamic_template_data":{ + "total":"$ 239.85", + "items":[ + { + "text":"New Line Sneakers", + "image":"https://marketing-image-production.s3.amazonaws.com/uploads/8dda1131320a6d978b515cc04ed479df259a458d5d45d58b6b381cae0bf9588113e80ef912f69e8c4cc1ef1a0297e8eefdb7b270064cc046b79a44e21b811802.png", + "price":"$ 79.95" + }, + { + "text":"Old Line Sneakers", + "image":"https://marketing-image-production.s3.amazonaws.com/uploads/3629f54390ead663d4eb7c53702e492de63299d7c5f7239efdc693b09b9b28c82c924225dcd8dcb65732d5ca7b7b753c5f17e056405bbd4596e4e63a96ae5018.png", + "price":"$ 79.95" + }, + { + "text":"Blue Line Sneakers", + "image":"https://marketing-image-production.s3.amazonaws.com/uploads/00731ed18eff0ad5da890d876c456c3124a4e44cb48196533e9b95fb2b959b7194c2dc7637b788341d1ff4f88d1dc88e23f7e3704726d313c57f350911dd2bd0.png", + "price":"$ 79.95" + } + ], + "receipt":true, + "name":"Sample Name", + "address01":"1234 Fake St.", + "address02":"Apt. 123", + "city":"Place", + "state":"CO", + "zip":"80202" + } + } + ], + "template_id":"[template_id]" +}' +{% endcodeblock %} + +It is important to note two sections of this call when using dynamic templates. + +In order to send dynamic content, you need to specify a JSON blob containing the dynamic data your template will use in the `dynamic_template_data` object. The handlebars script you write will refer to the values in your JSON blob by referencing the JSON key, check out [these examples]({{root_url}}/User_Guide/Transactional_Templates/Using_handlebars.html#-Handlebarjs-reference). This handlebars templating can be used in the text, html, and subject lines of your template. The total collective size of your dynamic data may not exceed 10,000 bytes per personalization object. + +{% codeblock %} + "dynamic_template_data":{ + "total":"$ 239.85", + "items":[ + { + "text":"New Line Sneakers", + "image":"https://marketing-image-production.s3.amazonaws.com/uploads/8dda1131320a6d978b515cc04ed479df259a458d5d45d58b6b381cae0bf9588113e80ef912f69e8c4cc1ef1a0297e8eefdb7b270064cc046b79a44e21b811802.png", + "price":"$ 79.95" + }, + { + "text":"Old Line Sneakers", + "image":"https://marketing-image-production.s3.amazonaws.com/uploads/3629f54390ead663d4eb7c53702e492de63299d7c5f7239efdc693b09b9b28c82c924225dcd8dcb65732d5ca7b7b753c5f17e056405bbd4596e4e63a96ae5018.png", + "price":"$ 79.95" + }, + { + "text":"Blue Line Sneakers", + "image":"https://marketing-image-production.s3.amazonaws.com/uploads/00731ed18eff0ad5da890d876c456c3124a4e44cb48196533e9b95fb2b959b7194c2dc7637b788341d1ff4f88d1dc88e23f7e3704726d313c57f350911dd2bd0.png", + "price":"$ 79.95" + } + ], + "receipt":true, + "name":"Sample Name", + "address01":"1234 Fake St.", + "address02":"Apt. 123", + "city":"Place", + "state":"CO", + "zip":"80202" + } +{% endcodeblock %} + +In addition to specifying the dynamic template data, you need to specify the template ID. The template ID is 64 characters with one dash (d-uuid). If you forget your template ID and want to access it from the API, use the following curl call to retrieve all of your transactional templates: + +{% codeblock %} +curl --request GET \ +  --url 'https://api.sendgrid.com/v3/templates?generations\%5C=legacy&generations\%5C=dynamic' \ +  --header 'Authorization: <>' \ +  --header 'Content-Type: application/json' +{% endcodeblock %} + +You can also copy your template ID from the app and paste it into your call. + +![]({{root_url}}/img/dynamic_template_id.png "Dynamic Template ID") + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Transactional Templates Overview](https://sendgrid.com/docs/User_Guide/Transactional_Templates/index.html) +- [Dynamic Templates API](https://dynamic-templates.api-docs.io/3.0) +- [Transactional Email Unsubscribes]({{root_url}}/User_Guide/Transactional_Email/unsubscribes.html) + diff --git a/source/User_Guide/Transactional_Templates/index.html b/source/User_Guide/Transactional_Templates/index.html deleted file mode 100644 index 1d196308cd..0000000000 --- a/source/User_Guide/Transactional_Templates/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Transactional Templates Overview -seo: - title: Transactional Templates Overview -weight: 100 -layout: page -navigation: - show: true ---- - -

    -SendGrid’s transactional templates let you use SendGrid's Email API for unmatched simplicity, flexibility, and control in the management of your email content and design. Get your templates out of your app and instead let your app leverage our transactional templates! Transactional templates enable seamless collaboration between marketers, developers, and designers, allowing each to work within SendGrid’s user interface to edit and create email templates for transactional emails. -

    - -{% info %} -There is currently a limit of 300 templates and 300 versions that may be created per account. For example, if you had 150 templates, each template could have 2 versions. This would give you a total of 300 versions and 150 templates. -{% endinfo %} - -

    -Transactional templates are account and subuser specific. Templates created on a parent account will not be accessible from the subuser accounts. -

    - -

    Templates and versions work together to allow you to easily and quickly iterate. Each version can have its own unique name, content, and subject. You may insert and edit HTML and inline CSS in your transactional templates visually or with a code editor. Plain-text content is supported as well.

    - -

    - Manage Your Templates -

    -

    - Update, add versions, and manage your templates in an easy to use interface. Keep your most recent template versions active and work on your new versions until they’re ready. - - -

    - -
    -
    -

    - Integrate With Your App -

    - - Talk to your development team about integrating your new template(s) with your application. They can read more about - how to integrate templates by checking out our Transactional Templates Web API Reference docs - and our SMTP API docs. -
    -
    - -
    -
    - -
    - -
    - -{% anchor h1 %} -Start Now! -{% endanchor %} - - -
    diff --git a/source/User_Guide/Transactional_Templates/manage.md b/source/User_Guide/Transactional_Templates/manage.md deleted file mode 100644 index 826a78a920..0000000000 --- a/source/User_Guide/Transactional_Templates/manage.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Manage Templates -seo: - title: Manage Templates -weight: 0 -layout: page -navigation: - show: true ---- - -Each template you create will have a grouping of versions for this template. This allows you to see where you’ve been and create new versions without using them until you make them active. - -Only one version can be active per template. - -When viewing your transactional templates, you may choose to display, or hide, any inactive template versions. - -![]({{root_url}}/images/templates_manage_1.png "Show inactive template versions.") - -![]({{root_url}}/images/templates_manage_2.png "Hide inactive template versions.") - - -{% anchor h2 %} -Managing Templates -{% endanchor %} - -
    -
    - From the main template view on each template group, you will see an actions menu. From this menu, you can choose to edit the name of your template, add a version, preview and test, or delete the template. -
    -
    - -
    -
    -
    - -You will also see a gear icon for each template version. Clicking this presents a menu allowing you to preview and test, edit, duplicate, and delete the template version. You can also use the preview modal to send a test. - -![]({{root_url}}/images/templates_manage_4.png) - -{% info %} -To delete a template, you must first delete all the versions of your template. -{% endinfo %} diff --git a/source/User_Guide/Transactional_Templates/migrating_from_legacy_templates.md b/source/User_Guide/Transactional_Templates/migrating_from_legacy_templates.md new file mode 100644 index 0000000000..f013afadd4 --- /dev/null +++ b/source/User_Guide/Transactional_Templates/migrating_from_legacy_templates.md @@ -0,0 +1,31 @@ +--- +layout: page +weight: 90 +title: Migrating from Legacy Templates +navigation: + show: true +seo: + title: Migrating from Legacy Templates + override: true + description: Migrating from legacy transactional templates to dynamic transactional templates utilizing handlebars syntax. + keywords: transactional email templates, email template, dynamic content, personalization, handlebars +--- + +If you have transactional templates you want to use with handlebars syntax, you need to migrate your legacy templates to the new dynamic templates page. + +{% info %} +The original template you copy won't be modified and remains active in any API or SMTP calls. To use the new template, update the template ID parameter in your code. +{% endinfo %} + +*To convert a legacy transactional template:* + +1. Navigate to the [legacy templates](https://sendgrid.com/templates) page. +1. Create a version of the template you wish to migrate or select the actions menu on the template version and select **Edit**. The template opens in the editor and a green banner appears at the top of the page specifying that the tempate you are editing is a legacy template. +1. Select **Copy as New Template**. +1. Give the template a new name and click **Copy as New Template**. +1. Once the template is successfully copied over, click **Continue**. The template opens in the editor and you are prompted to replace any existing substitution tags with handlebars syntax. +1. To replace any existing substitution tags, click **Replace your subsitution tags**. +1. Enter the opening and closing characters of your substition tags and click **Replace**. +1. The module replaces all of the substitution tags in your template with handlebars. + For example,{% raw %}{{your_tag_here}}{% endraw %}. + diff --git a/source/User_Guide/about.md b/source/User_Guide/about.md deleted file mode 100644 index bbfb28117e..0000000000 --- a/source/User_Guide/about.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -seo: - title: The SendGrid User Guide - description: The SendGrid User Guide provides information about the SendGrid UI - keywords: user guide, UI, user interface -title: About the User Guide -weight: -10 -layout: page -navigation: - show: true ---- - -The SendGrid User Guide will give you information about the different user interfaces within the SendGrid UI. As changes and new features are added to our UI, we will update the User Guide to reflect them. - -{% anchor h2 %} -Open Source -{% endanchor %} - -All of the SendGrid documentation, including the User Guide is open source via our [SendGrid Docs GitHub repository](https://github.com/sendgrid/docs). -The site is built using other Open Source tools such as [Ruby](https://www.ruby-lang.org/en/), [Jekyll](http://jekyllrb.com), -[jQuery](https://jquery.com/), [Bootstrap](http://getbootstrap.com), [Bower](http://bower.io/), [YUI tools](http://yuilibrary.com/), -and other Open Source libraries. - -{% anchor h2 %} -Make Changes -{% endanchor %} - -If you find something that needs to be updated or added, please feel free to suggest a change to these pages via the “View and Edit” link at the top of the page, or you can log into (or create) a GitHub account, click the edit pencil on the page, and then submit the change to us. We will reply quickly and if your change is accepted, we will send you a “thank you” gift for your changes. - -If you would prefer not to make changes, but would like to let us know about something, please use the feedback buttons on the bottom of the page you’re looking at. - -{% anchor h2 %} -Give Feedback -{% endanchor %} - -On every page within the User Guide, you can scroll to the bottom of the page and give us feedback. If the page is helpful, please let us know! If the page isn’t helpful, is missing something, or could use some more explanation, please let us know that as well. Our goal is to make your experience with SendGrid as smooth as possible and to provide more information than we hope any user will ever need about how to use SendGrid. diff --git a/source/User_Guide/dashboard.md b/source/User_Guide/dashboard.md deleted file mode 100644 index 1ba394c1c2..0000000000 --- a/source/User_Guide/dashboard.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -seo: - title: SendGrid Customer Dashboard - description: Manage your SendGrid account from the dashboard - keywords: SendGrid dashboard, SendGrid UI, UI, dashboard, Application -title: Dashboard -weight: 90 -layout: page -navigation: - show: true ---- - - - -The SendGrid dashboard is designed to give you an at-a-glance view of your current email activity. You can view the stats about all of the emails you have sent through your SendGrid account. - -{% anchor h2 %} -Stats -{% endanchor %} - -On your dashboard, you can choose to see the last 7 or the last 30 days of email statistics in the main graph so that you can keep an eye on your sending. From this graph, you can see Requests, Deliveries, Opens, Clicks, Bounces, and Spam Reports. - -If you want to see all of your email statistics, go to your [Statistics Page]({{site.app_url}}/statistics) via the graph icon on the left side menu. - -{% anchor h2 %} -Activity Feed -{% endanchor %} - -Your Activity Feed shows you the last 500 email activity events for your account. This includes all actions that you will see in your full Email Activity Feed. You can filter on any of the activity filters and you can search your activity by email address. - -If you’d like to see all of your email activity, please go to the [Email Activity]({{site.app_url}}/email_activity) page. For more information, please see the email activity documentation. - -{% anchor h2 %} -Transactional Emails -{% endanchor %} - -This box shows you the information for sending transactional emails via SendGrid’s [SMTP Relay]({{root_url}}/Glossary/smtp_relay.html). Your API Key is only shown once, when you create it, so it will not be shown on your dashboard. - -{% anchor h2 %} -Unsubscribe Groups -{% endanchor %} - -The Unsubscribe Groups box will show you the current status of unsubscribe groups in your account. From here you can click links to [manage]({{site.app_url}}/suppressions/advanced_suppression_manager) and integrate your unsubscribe groups. - -{% anchor h2 %} -Help Links -{% endanchor %} - -We have provided quick links to [Support](http://support.sendgrid.com/hc/en-us) and our [Documentation]({{root_url}}/). diff --git a/source/User_Guide/email_activity.md b/source/User_Guide/email_activity.md index c6421a59dc..5753a7d175 100644 --- a/source/User_Guide/email_activity.md +++ b/source/User_Guide/email_activity.md @@ -1,75 +1,229 @@ --- layout: page weight: 0 -title: Email Activity +title: Legacy Email Activity seo: - title: SendGrid Email Activity + title: SendGrid Legacy Email Activity description: Email activity allows you to see and search the email events on your account. - keywords: email activity, account events, email events + keywords: email activity, account events, email events, old email activity navigation: show: true --- +{% warning %} +If you are looking for the new Email Activity documentation, please go [here]({{root_url}}/User_Guide/email_activity_feed.html). +{% endwarning %} + -The Email Activity page allows you to view a snapshot of the email related activity that has been sent on your account. This does not include the information sent on a subuser account. These logs display all of your email events and can be viewed by the most recent activity or searched by email address. +- [Filtering the Activity Feed](#-Filtering-the-Activity-Feed) +- [Searching the Activity Feed](#-Searching-the-Activity-Feed) +- [Subuser email activity](#-Subuser-email-activity) +- [Email events](#-Email-events) +- [Troubleshooting](#-Troubleshooting) + - [Checking to see if a specific email was delivered](#-Checking-to-see-if-a-specific-email-was-delivered) + - [Deferrals](#-Deferrals) + - [Drops](#-Drops) + - [Bounces](#-Bounces) + - [Removing an email from a suppression list](#-Removing-an-email-from-a-suppression-list) + - [Setting up bounce forwarding](#-Setting-up-bounce-forwarding) + +The Email Activity feed allows you to view a snapshot of email-related activity associated with your account. These logs display all of your email events - filter by event type or search by email address. {% info %} -Email activity only shows the most recent 500 events. To access data in real time, we recommend that you consider implementing our Event Webhook. +Email activity shows the most recent 500 events. To access data in real time, implement our Event Webhook. {% endinfo %} +{% anchor h2 %} +Filtering the Activity Feed +{% endanchor h2 %} + +*To filter by event type:* + +1. On the [Email Activity page](https://app.sendgrid.com/email_activity), in the filter drop down, click the checkbox next to “All Filters”. +1. Select individual event types to filter. +
    The activity feed refreshes with the event types you selected. + +{% anchor h2 %} +Searching the Activity Feed +{% endanchor h2 %} + +*To search the Activity feed by email, mailbox name or domain name:* + +- To search by email, enter the recipient’s entire email address into the search field and click enter. +- To search by mailbox name (the part of an email before the @ symbol), enter the mailbox name into the search field and click enter. +- To search by domain name (the part of an email after the @ symbol), enter the domain into the search field and click enter. + +{% anchor h2 %} +Subuser email activity +{% endanchor h2 %} + +To see a subuser’s email activity, log in as that subuser or [impersonate]({{root_url}}/User_Guide/Settings/Subusers/impersonation.html) the subuser account. + +You cannot see a parent accounts email activity from a subuser account. + {% anchor h2 %} Email Events +{% endanchor h2 %} + +The Email Activity feed allows you to view specific information about messages sent from your account. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDescription
    ProcessedRequests from your website, application, or mail client via SMTP Relay or the API that SendGrid processed.
    ClicksWhenever a recipient clicks one of the Click Tracked links in your email.
    DeliveredThe accepted response generated by the recipients' mail server.
    OpensThe response generated by a recipient opening an email.
    UnsubscribesWhenever a recipient unsubscribes from your emails.
    Group UnsubscribesWhenever a recipient unsubscribes from a suppression group.
    Group ResubscribesWhen a recipient resubscribes themselves to a suppression group.
    DeferredThe recipient mail server asked SendGrid to stop sending emails so fast.
    DropsSendGrid will drop an email when the contact on that email is in one of your suppression groups, the recipient email previously bounced, or that recipient has marked your email as spam.
    Bounces The receiving server could not or would not accept the message. If a recipient has previously unsubscribed from your emails, your attempt to send to them is bounced.
    BlocksWhen your IP address has been blacklisted or blocked by an ISP or messaging organization. Blocks are less severe than bounces and do not result in permanent suppressions: subsequent sends to blocked email addresses are not automatically suppressed.
    Spam ReportsWhenever a recipient marks your email as spam and their mail server tells us about it.
    ParseTriggered if you're using the Inbound Parse Webhook.
    + +{% anchor h2 %} +Troubleshooting {% endanchor %} -You will be able to see data about the following types of email events in the Email Activity Feed: +{% anchor h3 %} +Checking delivery status of a specific email +{% endanchor %} -**[Processed]({{root_url}}/Glossary/request.html)** - Requests from your website, application, or mail client via SMTP Relay or the API that SendGrid processed. +You can check email delivery status by using the Email Activity page, or by using the Event Webhook. -**[Clicks]({{root_url}}/Glossary/clicks.html)** - Whenever a recipient clicks one of the Click Tracked links in your email. +- For a successful delivery, the Email Activity page, or the Event Webhook shows a delivered event - expanding it shows a reason code of 250 OK. This means the receiving server has accepted the message. You can also check bounced, deferred and processed messages. -**[Delivered]({{root_url}}/Glossary/deliveries.html)** - An email that was delivered to a recipient. +- If you can't find an email on the Email Activity page, check your suppression lists; [bounces]({{root_url}}/User_Guide/Suppressions/bounces.html), [blocks]({{root_url}}/User_Guide/Suppressions/blocks.html), [spam reports]({{root_url}}/User_Guide/Suppressions/spam_reports.html), [invalid email]({{root_url}}/User_Guide/Suppressions/invalid_emails.html). -**[Opens]({{root_url}}/Glossary/opens.html)** - Whenever an email is opened by a recipient. +- Have the recipient check their spam folder. -**Unsubscribes** - Whenever a recipient unsubscribes from your emails. +{% anchor h3 %} +Deferrals +{% endanchor %} -**Group Unsubscribes** - When a recipient unsubscribes from a suppression group. +In your logs, you may see the following error message accompanying a deferral event: -**Group Resubscribes** - When a recipient resubscribes themselves to a suppression group. +`Email was deferred due to the following reason(s): ["IPs reached ISP-suggested hourly limits" http://send.gd/1uKnEBh]` -**Deferred** - The recipient mail server asked SendGrid to stop sending emails so fast. +This deferral means you've been going over IP warmup limits on a new IP. For more information about IP Warmup, see [Warming up an IP Address]({{root_url}}/User_Guide/Settings/ip_warmup.html). -**[Drops]({{root_url}}/Glossary/drops.html)** - SendGrid will drop an email when the contact on that email is in one of your suppression groups, the recipient -email previously bounced, or that recipient has marked your email as spam. For more information, see [My Emails Are Being Dropped]({{site.support_url}}/hc/en-us/articles/200181728-My-emails-are-being-dropped-). +In your logs, you may see the following error message accompanying a deferral event: -**[Bounces]({{root_url}}/Glossary/bounces.html)** - When an email is attempted to be delivered, but the recipient mail server rejects it. +`Email was deferred due to the following reason(s): ["IPs reached ISP-suggested max connection limits: http://send.gd/1uKnEBh"]` -**[Blocks]({{root_url}}/Glossary/blocks.html)** - When your IP address has been blacklisted or blocked by an ISP or messaging organization. Blocks are less severe than bounces and do not result in permanent suppressions: subsequent sends to blocked email addresses are not automatically suppressed. +This deferral is created by SendGrid to control the rate of delivery by ISP to help prevent throttling and spam folder delivery. Sending too much mail too fast can cause different mail providers to be suspicious of the mail, and that impacts deliverability. This automatic deferral was put in place to allow senders to send as much mail as you want at once, without impacting your deliverability. -**[Spam Reports]({{root_url}}/Glossary/spam_reports.html)** - Whenever a recipient marks your email as spam and their mail server tells us about it. +{% anchor h3 %} +Drops +{% endanchor %} -**Parse** - Whenever an incoming email is processed through the [Inbound Parse Webhook]({{root_url}}/Classroom/Basics/Inbound_Parse_Webhook/setting_up_the_inbound_parse_webhook.html). +A drop occurs when you try to send a message to an email address listed on one of the suppression lists: Bounces, Unsubscribes, Spam reports and Invalid Emails. If an email is already on one of the lists, our systems automatically drop the email to protect your Sender Reputation. -{% anchor h2 %} -Filtering The Activity Feed +A dropped message cannot be resent automatically. To resend a message, first [remove the email from the suppression list](#-Removing-an-email-from-a-suppression-list), and then recreate and resend the email. + +{% anchor h3 %} +Bounces {% endanchor %} -**By Event** - If you’re looking into a single type of event, simply click the checkbox next to “All Filters” and then select the individual event types that you are looking for. The activity feed will refresh with only the event types you selected. +A bounce is a Drop event that occurs when a message to an address has previously Bounced. -{% anchor h2 %} -Searching Within Your Email Activity +You can visit the [Bounces list](https://app.sendgrid.com/suppressions/bounces) under the Suppressions tab, and search the address to find the details of the original attempt, such as the date and full error reason code. Once an address is on this list, we do not attempt to deliver further messages to it; we drop the message to protect your external reputation. + +A bounced message cannot be resent automatically. To resend a message, first [remove the email from the suppression list](#-Removing-an-email-from-a-suppression-list), and then recreate and resend the email. + +{% info %} +A delayed bounce occurs when a recipient server accepts a message (Delivered) and then is promptly declined (Bounced). This is an infrequent occurrence, and SendGrid treats these messages as a bounce, and any future sends to this address are dropped, unless you remove the email from your bounce suppression list. +{% endinfo %} + +{% anchor h3 %} +Removing an email from a suppression list {% endanchor %} -If you need to search for a specific recipient, enter the recipient’s entire email address into the search field and press enter. +SendGrid automatically drops emails sent to addresses on suppression lists. If you want to retry sending an email to an address that is on a suppressions list, you need to remove it from the list first. -You can also search by the mailbox name, the part before the @ symbol, or by the domain name, the part after the @ symbol. +{% warning %} +Only remove emails from these lists if you're sure the recipients want to receive the email. Otherwise, continuously sending to recipients who don't want your emails can negatively impact your sender reputation. +{% endwarning %} +*To remove an email from a suppression list:* -{% anchor h2 %} -Subuser Email Activity +1. In the UI, under [Suppressions](https://app.sendgrid.com/suppressions/global_unsubscribes), navigate to the suppression list that you want to remove a recipient from: [Global Unsubscribes](https://app.sendgrid.com/suppressions/global_unsubscribes), [Group Unsubscribes](https://app.sendgrid.com/suppressions/group_unsubscribes), [Bounces](https://app.sendgrid.com/suppressions/bounces), [Spam Reports](https://app.sendgrid.com/suppressions/spam_reports?), [Blocks](https://app.sendgrid.com/suppressions/blocks?), or [Invalid](https://app.sendgrid.com/suppressions/invalid_emails?). +1. Select the email you want to remove. +1. In the drop-down menu on the top right of the screen, select **Remove selected emails**. + +{% anchor h3 %} +Setting up bounce forwarding {% endanchor %} -To see a subuser’s email activity, you will need to either log in as that subuser or impersonate the subuser account. +You can receive bounce notifications to a specific address by enabling the "Forward Bounces" feature in your account and defining the forwarding address. However, you can also set it to send any bounces back to the originating FROM address. + +**To receive a bounce notification report to the FROM address on the email that bounced:** + +1. Navigate to **[Mail Settings](https://app.sendgrid.com/settings/mail_settings)** and select **Forward Bounce**. +1. Toggle the slider to **on** +1. Leave the "Use the from address" box ticked. +1. Leave the **email address** entry field blank. + +{% info %} +If you are sending bounce messages to a Gmail account, you need to set up an email filter in your inbox to tell Gmail not to send these messages to your spam folder. + +When Gmail doesn’t see a corresponding message in the sent folder connecting the bounce message, it may decide that the bounce message isn’t valid and send it to spam. + +One way to do this is in the filter, set up **From** `daemon` and **Has the words** `daemon`, and check the box **Never send it to Spam**. +{% endinfo %} + +These are some common issues people see with reading their email activity feed. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} -When looking at a subuser’s email activity, you will not see the subuser parent’s email activity. +- [Email Activity for Mobile ]({{root_url}}/User_Guide/SendGrid_for_Mobile/email_activity.html) +- [Dashboard]({{root_url}}/User_Guide/dashboard.html) +- [Option to "Delete From Bounce List" in Email Activity]({{root_url}}/Classroom/Track/Bounces/delete_from_bounce_list_option_in_email_activity.html) diff --git a/source/User_Guide/email_activity_feed.md b/source/User_Guide/email_activity_feed.md new file mode 100644 index 0000000000..d03236b779 --- /dev/null +++ b/source/User_Guide/email_activity_feed.md @@ -0,0 +1,190 @@ +--- +layout: page +weight: +title: Email Activity Feed +navigation: + show: true +seo: + title: Email Activity Feed + override: true + description: +--- +{% info %} +Higher volume users may not yet have access to the new Email Activity Feed. For information about the legacy Email Activity Feed, see [Legacy Email Activity]({{root_url}}/User_Guide/email_activity.html). +{% endinfo %} + + + +The Email Activity feed allows you to view a snapshot of email-related activity associated with your account and any subusers. Enhanced email activity and storage gives you increased visibility into the email delivery flow of each email message to expedite the troubleshooting process. + + +* [Types of Email activity data](#-Filtering-email-activity) +* [Filtering email activity](#-Filtering-email-activity) + * [Basic search](#-Basic-search) + * [Advanced search](#-Advanced-search) +* [Viewing event history](#-Viewing-event-history) +* [Exporting a CSV](#-Exporting-a-CSV) + +With the Email Activity feed you can: + +* Troubleshoot email delivery issues faster with comprehensive and sequential event data by email message. +* Pinpoint specific emails easily with advanced search and filter options --including subject line and email metadata. +* Customize your data independently with CSV download/export option. +* Increase storage available for up to 30 days for historical visibility within the UI by purchasing an upgrade. +* Call all events by an email from the API with additional storage purchase. + +{% info %} +In order to gain access to the Email Activity Feed API, you must purchase [additional email activity history](https://app.sendgrid.com/settings/billing/addons/email_activity). +{% endinfo %} + +{% anchor H2 %} +Types of email activity data +{% endanchor %} + +The Email Activity feed allows you to view specific information about messages sent from your account. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDescription
    ProcessedRequests from your website, application, or mail client via SMTP Relay or the API that SendGrid processed.
    ClicksWhenever a recipient clicks one of the Click Tracked links in your email. In the Email History SendGrid displays the date, time, and the URL for the link that was clicked.
    DeliveredThe accepted response generated by the recipients' mail server.
    OpensThe response generated by a recipient opening an email.
    UnsubscribesWhenever a recipient unsubscribes from your emails.
    Group UnsubscribesWhenever a recipient unsubscribes from a suppression group.
    Group ResubscribesWhen a recipient resubscribes themselves to a suppression group.
    DeferredThe recipient mail server asked SendGrid to stop sending emails so fast.
    DropsSendGrid will drop an email when the contact on that email is in one of your suppression groups, the recipient email previously bounced, or that recipient has marked your email as spam.
    Bounces The receiving server could not or would not accept the message. If a recipient has previously unsubscribed from your emails, your attempt to send to them is bounced.
    BlocksWhen your IP address has been blacklisted or blocked by an ISP or messaging organization. Blocks are less severe than bounces and do not result in permanent suppressions: subsequent sends to blocked email addresses are not automatically suppressed.
    Spam ReportsWhenever a recipient marks your email as spam and their mail server tells us about it.
    + +{% anchor H2 %} +Filtering email activity +{% endanchor %} + +The Email Activity feed lists each email sent. Click on each email to view the current list of triggered events for that email. Use our basic or advanced search to filter by email subject, recipients, or event types. + +{% anchor H3 %} +Basic search +{% endanchor %} + +The email address field filters with an approximate, or fuzzy search. The date field pulls filters events that fit within the precise date range specified. + +{% info %} +To filter by event type, like in the legacy Email Activity Feed, use [Advanced search](#-Advanced-search), and select Event Type, and choose an event type to filter by. +{% endinfo %} + +{% anchor H3 %} +Advanced Search +{% endanchor %} + +In addition to viewing the email activity associated with your account by recipient email address, domain, or event date, you can also use the following filters to sort your data: + +* API Key ID +* API Key Name +* Campaign ID +* Campaign Name +* Categories +* Date Processed +* Event Type (Bounced, Clicked, etc.) +* From Email Address +* Message ID +* Number of Clicks +* Number of Opens +* Requesting IP Address +* Sending IP Address +* Status (Delivered, Not Delivered, Processing) +* Subject Line +* Teammate +* To Email Address +* Transactional Template ID +* Transactional Template Name +* Unsubscribe Group ID +* Unsubscribe Group Name + +*To use advanced search:* + +1. At the top of the Activity Feed page, click **Advanced** search. +1. In the field on the far left, select the criteria to filter your event data. +1. Once you have filled in all of the fields associated with that filter, click **Search**. + To add additional search criteria, click **Add a Filter**. + + ![]({{root_url}}/img/EASE_advanced_search_filter.gif "Email Activity Advanced Search") + +*To further narrow your search results:* + +* Search emails by **any** of the following - This search will return more results and will pull in all events that meet *one or more* of the criterion specified by the selected filters. +or +* Search emails by **all** of the following - This search will return fewer results and will pull in events that meet *every* criteria specified by the selected filters. + +{% anchor H2 %} +Viewing event history +{% endanchor %} + +*To view event history:* + +1. Navigate to the event you wish to view and click on the entry. + Once the entry loads, you can click into each of the sections to view more details of each email message. +1. When you have finished reviewing the data, click **close**. + +![]({{root_url}}/img/EASE_email_information.gif "Email Activity information panel") + +{% anchor H2 %} +Exporting a CSV +{% endanchor %} + +*To export a CSV:* + +1. In the top right corner of the activity feed, click **Export CSV**. + This triggers an email to the email address associated with your SendGrid account. +1. Open the email and then click **Download**. + +{% anchor h2 %} +Additional Resources +{% endanchor h2 %} + +- [Email Activity API](https://sendgrid.api-docs.io/v3.0/email-activity/filter-all-messages) +- [Legacy Email Activity](https://sendgrid.com/docs/User_Guide/email_activity.html) +- [Getting Started with the Email Activity API](https://sendgrid.com/docs/API_Reference/Web_API_v3/Tutorials/getting_started_email_activity_api.html) +- [Building compound Email Activity queries](https://sendgrid.com/docs/API_Reference/Web_API_v3/Tutorials/getting_started_email_activity_api.html#-Creating-compound-queries) + diff --git a/source/VidGrid/email_activity.html b/source/VidGrid/email_activity.html deleted file mode 100644 index 57c91c9c92..0000000000 --- a/source/VidGrid/email_activity.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - Redirecting... - - - - - -

    Redirecting...

    -

    Click here if you are not redirected.

    - - - diff --git a/source/_assets/javascripts/callouts.js b/source/_assets/javascripts/callouts.js index 06163e8bc6..c7f2d09147 100644 --- a/source/_assets/javascripts/callouts.js +++ b/source/_assets/javascripts/callouts.js @@ -7,4 +7,4 @@ jQuery(function ($) { } }) }); -}); \ No newline at end of file +}); diff --git a/source/_assets/javascripts/iframe_docs.js b/source/_assets/javascripts/iframe_docs.js index 2ce298c224..3af645324c 100644 --- a/source/_assets/javascripts/iframe_docs.js +++ b/source/_assets/javascripts/iframe_docs.js @@ -13,7 +13,7 @@ function apidocs_iframe() { url += "/"+path.replace("#",""); } - $('#content .iframe-container').html(''); + $('#content .iframe-container').html($('').attr('src', url)); } } diff --git a/source/_assets/javascripts/jquery.indextank.autocomplete.js b/source/_assets/javascripts/jquery.indextank.autocomplete.js index 07e88a57c6..7893bcc412 100644 --- a/source/_assets/javascripts/jquery.indextank.autocomplete.js +++ b/source/_assets/javascripts/jquery.indextank.autocomplete.js @@ -79,4 +79,4 @@ this.data("Indextank.Autocomplete"); }; -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/source/_assets/javascripts/jquery.indextank.ize.js b/source/_assets/javascripts/jquery.indextank.ize.js index bf3696ab25..cbe186ac6d 100644 --- a/source/_assets/javascripts/jquery.indextank.ize.js +++ b/source/_assets/javascripts/jquery.indextank.ize.js @@ -53,4 +53,4 @@ this.data("Indextank.Ize"); }; -})(jQuery); \ No newline at end of file +})(jQuery); diff --git a/source/_assets/javascripts/menu-icon.js b/source/_assets/javascripts/menu-icon.js index a02715597f..1a80ed8132 100644 --- a/source/_assets/javascripts/menu-icon.js +++ b/source/_assets/javascripts/menu-icon.js @@ -2,4 +2,4 @@ $(function(){ $('#nav-icon').click(function(){ $(this).toggleClass('open'); }); -}); \ No newline at end of file +}); diff --git a/source/_assets/javascripts/menu.js b/source/_assets/javascripts/menu.js index bcb5ea63c4..2d2fa71a17 100644 --- a/source/_assets/javascripts/menu.js +++ b/source/_assets/javascripts/menu.js @@ -22,4 +22,4 @@ $(function() { $(this).toggleClass("shown"); } }); -}); \ No newline at end of file +}); diff --git a/source/_assets/javascripts/responsive-menu.js b/source/_assets/javascripts/responsive-menu.js index a83d85ffdc..6936165dbe 100644 --- a/source/_assets/javascripts/responsive-menu.js +++ b/source/_assets/javascripts/responsive-menu.js @@ -16,4 +16,4 @@ function checkSize(){ } else if (($("#js-sidebar-links").css("display") == "none" ) && headerDropdown.length) { headerDropdown.appendTo($("#sidebar-wrapper")); } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/base/fonts.less b/source/_assets/stylesheets/base/fonts.less index 285f0ff721..a6323cc974 100644 --- a/source/_assets/stylesheets/base/fonts.less +++ b/source/_assets/stylesheets/base/fonts.less @@ -1,11 +1,11 @@ @font-face { - font-family:'Colfax-Light'; - src: url(https://sendgrid.com/mkt/assets/colfax/ColfaxWebLight.eot); - src: url(https://sendgrid.com/mkt/assets/colfax/ColfaxWebLight.eot?#iefix) format("embedded-opentype"),url(https://sendgrid.com/wp-content/themes/sgdotcom/grid/fonts/colfax/ColfaxWebLight.woff) format("woff") + font-family:'Colfax-Light'; + src: url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebLight.eot); + src: url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebLight.eot?#iefix) format("embedded-opentype"),url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebLight.woff) format("woff") } @font-face { - font-family:'Colfax-Medium'; - src: url(https://sendgrid.com/mkt/assets/colfax/ColfaxWebMedium.eot); - src: url(https://sendgrid.com/mkt/assets/colfax/ColfaxWebMedium.eot?#iefix) format("embedded-opentype"),url(https://sendgrid.com/wp-content/themes/sgdotcom/grid/fonts/colfax/ColfaxWebMedium.woff) format("woff") + font-family:'Colfax-Medium'; + src: url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebMedium.eot); + src: url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebMedium.eot?#iefix) format("embedded-opentype"),url(https://sendgrid.com/wp-content/themes/sgdotcom/assets/fonts/colfax/ColfaxWebMedium.woff) format("woff") } diff --git a/source/_assets/stylesheets/components/anchor.less b/source/_assets/stylesheets/components/anchor.less index e56b087ec5..39260734bd 100644 --- a/source/_assets/stylesheets/components/anchor.less +++ b/source/_assets/stylesheets/components/anchor.less @@ -20,4 +20,4 @@ .anchor-wrap:hover .anchor-icon i { display: inline-block; -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/badge.less b/source/_assets/stylesheets/components/badge.less index 769006db13..afc6744754 100644 --- a/source/_assets/stylesheets/components/badge.less +++ b/source/_assets/stylesheets/components/badge.less @@ -6,4 +6,4 @@ padding: 2px 5px 3px; font-size: 11px; margin-left: 7px; -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/breadcrumbs.less b/source/_assets/stylesheets/components/breadcrumbs.less index 9fa6407a89..48b2e57ac7 100644 --- a/source/_assets/stylesheets/components/breadcrumbs.less +++ b/source/_assets/stylesheets/components/breadcrumbs.less @@ -14,4 +14,4 @@ float: right; }); } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/callout.less b/source/_assets/stylesheets/components/callout.less index 836cdc53e3..77073624bd 100644 --- a/source/_assets/stylesheets/components/callout.less +++ b/source/_assets/stylesheets/components/callout.less @@ -30,4 +30,4 @@ margin: 16px 0 0 0; } } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/feedback.less b/source/_assets/stylesheets/components/feedback.less index f1cd712e51..f1f000b0f3 100644 --- a/source/_assets/stylesheets/components/feedback.less +++ b/source/_assets/stylesheets/components/feedback.less @@ -67,4 +67,4 @@ } }); } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/iframe.less b/source/_assets/stylesheets/components/iframe.less index 66709ff856..a1b45432b3 100644 --- a/source/_assets/stylesheets/components/iframe.less +++ b/source/_assets/stylesheets/components/iframe.less @@ -10,4 +10,4 @@ width: 100%; display: block; } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/indicators.less b/source/_assets/stylesheets/components/indicators.less index f21888bf56..d102fd2414 100644 --- a/source/_assets/stylesheets/components/indicators.less +++ b/source/_assets/stylesheets/components/indicators.less @@ -11,4 +11,4 @@ height: 16px; display: inline-block; vertical-align: middle; -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/modal.less b/source/_assets/stylesheets/components/modal.less index f371a78431..297f0f5b5c 100644 --- a/source/_assets/stylesheets/components/modal.less +++ b/source/_assets/stylesheets/components/modal.less @@ -12,4 +12,4 @@ .btn + .btn { margin-left: 16px; } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/overlay.less b/source/_assets/stylesheets/components/overlay.less index c453fb1c36..754e92570c 100644 --- a/source/_assets/stylesheets/components/overlay.less +++ b/source/_assets/stylesheets/components/overlay.less @@ -11,4 +11,4 @@ #overlay .code-buttons { margin-top: 20px; -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/subsection.less b/source/_assets/stylesheets/components/subsection.less index 5847603644..01fd188113 100644 --- a/source/_assets/stylesheets/components/subsection.less +++ b/source/_assets/stylesheets/components/subsection.less @@ -7,4 +7,4 @@ margin-top: 0; font-weight: 700; } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/syntax.less b/source/_assets/stylesheets/components/syntax.less index 7fe560cb02..7ed54b0086 100644 --- a/source/_assets/stylesheets/components/syntax.less +++ b/source/_assets/stylesheets/components/syntax.less @@ -366,4 +366,4 @@ figure.code.expanded { .data-value { color: #859900; -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/tabs.less b/source/_assets/stylesheets/components/tabs.less index cdf2782801..9add7a2776 100644 --- a/source/_assets/stylesheets/components/tabs.less +++ b/source/_assets/stylesheets/components/tabs.less @@ -39,4 +39,4 @@ } } } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/components/video.less b/source/_assets/stylesheets/components/video.less index b96084d6c7..c6f79c7d05 100644 --- a/source/_assets/stylesheets/components/video.less +++ b/source/_assets/stylesheets/components/video.less @@ -27,4 +27,4 @@ width: 100%; position: absolute; } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/functions/media.less b/source/_assets/stylesheets/functions/media.less index d610016e17..f461016d6d 100644 --- a/source/_assets/stylesheets/functions/media.less +++ b/source/_assets/stylesheets/functions/media.less @@ -8,4 +8,4 @@ @media only screen and (max-width: @max-width) { @rules(); } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/icomoon.less b/source/_assets/stylesheets/icomoon.less index e6a710a09f..418d41adcd 100644 --- a/source/_assets/stylesheets/icomoon.less +++ b/source/_assets/stylesheets/icomoon.less @@ -193,4 +193,4 @@ } .icon-arrow-down:before { content: "\e637"; -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/pages/glossary.less b/source/_assets/stylesheets/pages/glossary.less index df44bcb1d1..720c8399c5 100644 --- a/source/_assets/stylesheets/pages/glossary.less +++ b/source/_assets/stylesheets/pages/glossary.less @@ -28,4 +28,4 @@ } } } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/pages/home.less b/source/_assets/stylesheets/pages/home.less index b8ab756dbb..edaefcf297 100644 --- a/source/_assets/stylesheets/pages/home.less +++ b/source/_assets/stylesheets/pages/home.less @@ -41,4 +41,4 @@ .home.feedback-cta { padding-top: 36px; border-top: 1px solid @gray; -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/pages/search.less b/source/_assets/stylesheets/pages/search.less index ecdb1a4679..eb3057342e 100644 --- a/source/_assets/stylesheets/pages/search.less +++ b/source/_assets/stylesheets/pages/search.less @@ -19,4 +19,4 @@ input[type="submit"] { margin: 16px 0 36px; } -} \ No newline at end of file +} diff --git a/source/_assets/stylesheets/pages/try-it.less b/source/_assets/stylesheets/pages/try-it.less index cb7373d977..34623dceaa 100644 --- a/source/_assets/stylesheets/pages/try-it.less +++ b/source/_assets/stylesheets/pages/try-it.less @@ -18,4 +18,4 @@ .hljs { max-width: 624px; -} \ No newline at end of file +} diff --git a/source/_includes/asides/page_navigation.html b/source/_includes/asides/page_navigation.html index 8d81bfb1a3..cc1ea8cb0a 100644 --- a/source/_includes/asides/page_navigation.html +++ b/source/_includes/asides/page_navigation.html @@ -12,6 +12,10 @@ - + diff --git a/source/_includes/feedback.html b/source/_includes/feedback.html index c34d1b4601..f1914f1f53 100644 --- a/source/_includes/feedback.html +++ b/source/_includes/feedback.html @@ -29,7 +29,7 @@ diff --git a/source/_includes/head.html b/source/_includes/head.html index e88434c196..3cad703f47 100644 --- a/source/_includes/head.html +++ b/source/_includes/head.html @@ -40,7 +40,7 @@ {% endif %} {% capture canonical %}{% if page.seo.canonical %}{{ page.seo.canonical }}{% else %}{{site.url}}{{page.url}}{% endif %}{% endcapture %} - {% comment %} ## This is an easy way to check if the canonical url has a protocol – it's only displayed if it does. ## {% endcomment %} + {% comment %} ## This is an easy way to check if the canonical url has a protocol – it's only displayed if it does. ## {% endcomment %} {% capture canonicalprotocolfree %}{{ canonical | replace:'http','' }}{% endcapture %} {% if canonical and canonicalprotocolfree != canonical %} @@ -86,40 +86,14 @@ - +