What I learned this week about: Pardot Form Handlers

A better title: What I learned last year about Form Handlers and am now getting around to posting. Holidays, amirite?

I could probably write a whole series on Pardot Forms and Form Handlers, but it’s also probably been done already. Plus there is documentation available. Or you could pop over to Jenna Molby’s blog for a lot of great content in that same arena.

I’m here today to get into some of the things that you really need to know and consider upfront because here’s how a lot of conversations about form handlers go:

Me: Pardot has forms, which are fully functional, hosted on your Pardot instance, and can take some custom styling, and it has form handlers, which allow you to identify the fields that you want to accept data for, and then Pardot generates a post-to URL.

You: So there’s really no difference?

Me: No, there is a big difference. One is a form. One is a post-to URL, so ANOTHER form can send data to that handler, and then the handler disperses the info to Pardot.

You: So form handlers are better for forms that have custom formatting?

Me: They CAN be, but I tend to think of it as – ‘I have a longer, more complex form, and I only need SOME of the data to go to Pardot.’

You: But they can do all the same things, right?

Me: No. Because the form handler is just a post-to URL.

You: I get it. We want to do a form handler, then. Our web developer will create the form.

Fast forward a few weeks, maybe even months, and when troubleshooting happens, everyone is confused. Here are the reasons why and what you should know BEFOREHAND.

Troubleshooting a form handler takes place in two (or more) places.

Scenario: We have a form on a website that is accepting four fields, and some of those fields are not appearing in Pardot.

What you need to check:

  • The fields identified for your form handler
  • The data type of the field on your form
  • The data type of the field defined in your form handler
  • The data type of the field in Pardot accepting the data
  • The field name on your form
  • The field name defined in your form handler

If ANY OF THOSE are out of sync (as in not exactly the same), then you will not get data in that field.

When you bring Salesforce into the mix, it can become even more complicated, as you now need to consider your data formatting from form, to form handler, to Pardot Prospect field, to Salesforce field.

You have basically ZERO (0) options for form handlers.

Want a custom error message? You have to create it on your site.

Want progressive profiling? You have to create it on your site. (Oh, and you have a required field on your handler? Then guess what has to be on EVERY VERSION of that custom built form.)

Want to control accepted data values, like for a dropdown menu? You have to enforce that on your site.

Here’s what you can control with your Form Handler:

  • What fields will accept data from your form
    • What format that data should be in
    • What the name of that field is on the form itself
    • Is this data required?
  • A success location (where the form redirects on a successful submission)
  • An error location (where the form redirects if there is an error – but see note #1 above)

That’s basically it. If you want to change something, ask yourself – is it one of those three things above? No? Then it needs to be changed on your site.

The ONLY THING a form handler does is generate a post-to URL and then disperse data to Pardot fields.

Oh yeah – you should know what a post-to URL is.

To understand what Pardot is actually doing, you need to understand the two basic functions of an integration (like SUPER BASIC functions) – you can GET data FROM a place, or you can POST data TO a place.

With a form handler, we are essentially building half of an integration. We have a custom HTML (probably) form that we’ve dropped onto our website, and that form does All The Things. It controls the look and feel, what questions show up, the format of those questions, etc.

When someone clicks on that submit button, Stuff happens. One of the Stuffs that can happen is a POST method (a command that tells the form to send data to a place). When we POST, we have to tell the form WHERE to post. And we can do that via a URL.

Pardot provides that custom URL for us when we create a form handler. When the data is submitted, the data types that we defined, and whether or not a field is required, is reviewed, and a success or error message is sent back to the originating source. And of course the data that is accepted is then entered to a Pardot Prospect, based on the field mapping we provided.

Untitled Diagram.jpg

Speaking of fields…you should also know that

  • checkboxes are not going to work the way you think they will
  • date fields in Pardot use a different format than Salesforce date fields
  • you cannot add custom validation to the fields on the form handler (see section 2)

Checkboxes are the big one here.

What you expect: When I check a box, that means that the Thing is True.

What Pardot understands: Nothing. It understands nothing.

This is what adding a checkbox to your form handler looks like:

Screen Shot 2020-01-06 at 10.12.22 AM

Do you see a place for checkbox? Boolean? NOPE.

Guess where you can control what actually gets passed to your form handler? 100 points if your answer was “on the form itself on the site” or similar.

I’ll just write a whole other post about checkboxes in Pardot, actually, so stay tuned.

They aren’t inherently evil, but…

I am not here to just bash form handlers. They can be a useful tool, but it is worth mentioning that they come with additional complexity that assumes a certain level of comfort with some technical concepts – HTML, CSS, HTML methods, etc. They are not for the faint of heart, and they are not a good substitute for true forms.

So when do I recommend using them, for reals?

  • If you have a very long, custom form, and you want SOME of that data to go to Pardot AND the data is very simple
  • If you have very strict requirements for customization that a standard Pardot form cannot guarantee (this is unlikely, but you never know)
  • If you already have a form and just need to send the data to Pardot AND the data is very simple
  • You have a form tool like Form Assembly that has a pre-built integration and are figuring “WHY NOT?”

That’s pretty much it. And that last one even is meh.

A final note/rant on this stuff

Pardot forms (and handlers) are NOT meant to be a full form solution. You should not be using either of these options for things like applications. Think of a Pardot form/handler as a handshake. What is the most basic information you need from a person to get to know them? What is a FAIR exchange of information with your prospects at the lowest level?

If you keep that in mind, forms and handlers are much easier to deal with.

As always it’s about the right tool for the job. Just make sure you know exactly what you’re doing before you pick up a form handler.

What I learned this week about: Pardot Responsive Layouts

I built my first responsive email template in 2014 when I was just coming into the MOPs/Salesforce Admin portion of our programming and realized that my company’s marketing emails were NOT responsive.

Me being me, I ended up sitting through a free webinar put on by Litmus to gain the basic understanding of how responsive emails worked, and from there I was the go-to on the team for all things HTML and CSS. I fumbled my way through enough to ensure that our emails and custom landing pages would look good on mobile.

Side note: I did all of this because I had reviewed the open rates based on device and found that approximately 30-40% of our emails were being opened on mobile. That’s a pretty sizable chunk of people having to squint at tiny print on a small screen.

I am not an expert on this stuff at all, so I’m not about to sit here and break down how to do this – there are much better resources out there for that. All you need to really understand about this is that responsive emails are based on tables, as in:

<table>

<tr><td></td></tr>

</table>

That at least I understood having been big into building strangely elaborate personal webpages when in school. I wish I had screenshots of some of the work I did back then – it wasn’t terrible, all things considered.

For responsive emails these are important because you end up with nested tables – tables inside of table cells inside of tables. Tableception, if you will. (Is that joke still a thing? I use it a lot.)

And then on top of that, there are some special little tweaks you can make to the CSS itself to ensure that when the size of the screen shrinks, those tables all shift around into place, so instead of squished, you get stacked.

Screen Shot 2019-10-29 at 1.17.34 PM <– Like that.

So what does this have to do with Pardot??

In a few implementations clients have used one of the prebuilt responsive templates in Pardot and found that instead of stacking, their template just shrank down into a smaller version of the same layout.

For whatever reason this didn’t seem to happen in previews or even with all template layouts, but for this client it did, and I wanted to fix it. It took some digging. And by digging, I mean rewriting the code almost line-by-line to find the issue, but when I did find it, it seemed a little silly.

The key to that fancy table action above working is in the CSS that exists for that email, so before we even start adding our tables and rows and cells and tables inside of cells…we have our CSS classes defined. Think of those classes as references; later in the HTML tables, I can reference my CSS via the class name, and that is used to display the info according to that reference.

But what I found was a table referencing a class that wasn’t there. Simple mistake and simple solution – we just had to drop the appropriate class name (reference) in the CSS, and BOOM! We had a nice, stacked template.

So what happened??

¯\_(ツ)_/¯

It’s possible that the client made some small change during editing that removed that class. It’s possible that on that particular layout, the class just wasn’t included. I don’t know, but what I took away from that was to just check.

This is true no matter the platform. Any time you are using work or designs created by another source for mass consumption and reuse, just take a minute and review it. Become familiar with it. In a way, the HTML/CSS of your email templates is like a manual for a new gadget you’re putting together. It’s tedious to go through it, and wouldn’t we rather just slap the thing together and be done? Sure. But if you take that time at the beginning to introduce yourself, you’re more likely to find little hiccups. You know, before you start putting any real weight on the thing.

 

What I learned this week: Providers & Self-Signed Certificates

I would say that about once a month I have a client or coworker sending me an email that looks like this and asking “what do I do?”

SelfSignedCert has expired
SFDC Expired Certification Notification

I remember getting my first one of these and panicking, and the documentation available for admins with little knowledge of single sign-on is poor. I am pretty sure that we have all found the answer via the Answers section of Salesforce’ Help, as opposed to actual documentation.

I have kept a link on hand to share for just this occasion (it’s here, in case you need it).

Fast forward a few years, and I’m studying security and identify more in-depth than I have in the past, and much like data skew, that involves learning the correct terms for what used to sound like jargon.

As the link above to Salesforce’s help article states, this Self-Signed certificate is most commonly used for Single Sign-On settings, but…what does that mean? As with anything else, stating the purpose or cause of something doesn’t always answer a person’s question. Many people much smarter than me have rightly pointed out that if you cannot explain a concept to a child, you do not truly understand that concept. And Salesforce’s Help Articles aren’t always great for that level of explanation.

So let’s start with the basics: Single Sign-On.

If you work for a company in an office, you may already experience this everyday. You log into your computer, and doing so logs you into other company services – an extranet, your inbox, etc. To varying degree, the idea is in the name – you sign in once to multiple platforms.

Ultimately this works because there are two entities working together to allow this to happen.

The Service Provider is the system you’re being logged into secondarily – let’s say JIRA. This is the platform that is requesting your login credentials. Normally this request looks like a login screen, but for single sign-on the whole point is that you bypass that screen. So instead of asking YOU, it asks the system you’re logging in through.

This initial system is the Identity Provider. It is helpfully passing along your credentials to the system that needs the information.

Salesforce, as you can imagine, can be both. And the self-signed certificate is sort of like your global permission slip. And like a permission slip it needs to be updated every once in a while.

“But I don’t have single sign-on enabled!” you cry.

Well sure, that makes sense. That means that Salesforce may not be a Service Provider in your org.

Have you installed any connected apps, though? Many connected apps walk you through a setup process that includes a handy UI that takes on the heavy lifting of setting up your API connection. During this process, some of those apps may create a certificate, which you’ll see by reviewing your connected apps link to that certificate. Sometimes these will take care of themselves – the third party companies you’re working with KNOW about this, and they plan accordingly, but at the least, you’ll know.

And if you’ve enabled Salesforce as an Identity Provider, even if you’re not using it that way…well, there you go.

Long story short: if you don’t remember setting this up, it’s very unlikely to cause issues, but it’s also very easy to update. Bookmark that link, and next year when you get that email, you’ll be ready.

 

What I learned this week: Data Skew

Disclaimer: In the spirit of full transparency, I learned about data skew a little while ago. But the whole point is “what I learned this week.” In some cases, “this week,” just refers to this week in time…like…last week, last month, whatever.

My first brush with NPSP was as a consultant. I remember very clearly thinking that some of the features would have been very handy for my B2B sales staff back in the day. In a lot of ways it was love at first sight. I still get prickly when people say mean things about it…

[Insert about a half hour of me looking for the best option for a “Don’t talk to me or my son ever again” meme before realizing there could potentially be a better use for my time.]

That said, the first time I started getting error emails at about 2am was ALSO around this time.

You know, this one:

Message: “First error: Update failed. First exception on row 0 with id 001……………; first error: UNABLE_TO_LOCK_ROW, unable to obtain exclusive access to this record or 1 records: 001…………….: []”

And I was flummoxed. What does that even mean? Why are you locking anything? Who said that you needed exclusive rights? And what does this have to do with merging records?

For a while I sort of…ignored it. Honestly it would run again at some point, right? It rarely happened more than once for the same record.

Sometimes I would have dozens of them. Usually right after some major data change or something. I suspected they were related, but I had other pressing concerns, and eventually everything would be sorted.

Over time I filled in the blanks. Unable to lock row meant that whatever the code was trying to do, it couldn’t get update access to the record.

If I spent more than 30 seconds on it, it made sense. A record cannot be edited by more than one person at a time, so why would it make an exception (ha ha – get it?) for custom code.

And then again, for a while, I left it at that.

Enter Data Architect Trailmix, stage right.

A super important part of the large data volume considerations that are discussed in the data architect arena is the concept of data skew. And as I read about it, I was taken back to a project early on, a move from the Starter Pack and a bucket model to NPSP with Household Accounts.

This client was looking to upgrade to the new success pack. They had been using the bucket model for YEARS – more than 50,000 contacts all inelegantly shoved into this single Account called “Individual.”

It was difficult to report on things. It took forever for the record to load.

I knew that there was a correlation, but I could not, especially at that time, explain what it was. I had a sense that having to many child records was a bad thing. I didn’t know what to call it. And I wouldn’t know, until years later, that that very situation was what caused errors during the overnight batch processing.

Data skew occurs when we have too many child records, plain and simple. It has an impact on loading time (you try showing a record and querying tens of thousands of records at one time), reporting, and…yes, automation.

It doesn’t exactly help me fix the errors all the time. Sometimes it’s just bad timing, and not even because of data skew. But putting a name to something makes it more accessible, less concerning.

Carry on, NPSP. Carry on.

What I learned: TDX19

We’re just going to leave the elephant in the room right where it is, so…make peace with that.

I had the great pleasure to attend TrailheaDX last week, Salesforce’s smaller developer conference, in San Francisco. It was my first TDX, but I certainly hope it won’t be my last.

For those who have never been, it is WAY smaller than Dreamforce. Dreamforce spans over blocks and blocks, from Moscone to local hotels, and it’s not unheard of to walk close to a mile just to get from one session to another. TrailheaDX is not like that. It takes place entirely in Moscone West – granted, all three floors, but comparatively, it’s easy.

It also is repetitive. That has some negative connotations, I realize, but hear me out.

Dreamforce takes place over what I’m confident is half of the city, and very few sessions are alike. If you miss a session because you’re on one end of the event, and the session is on the other, then that’s it. You can hopefully catch a recording later.

TDX had some – not all – but some sessions repeated in the theaters, so if you missed it one time, you might be able to catch it again. Not all of the sessions worked that way, but enough of them that I was able to safely select one session over another because I knew I’d get a second chance later during the event.

There was still all of the energy and good vibes of the community; I still got to see a lot of my friends and coworkers.

And this was the first time in years that I simply attended the event. I didn’t volunteer or serve on a panel or do anything but go to sessions and try to absorb, and I’m glad I did. I learned quite a bit while I was there, and I came away energized enough to sit down and write this. Which is no small feat.

I had a bit of an epiphany, as well, that I’d like to share now.

As a self-proclaimed polymath, I have struggled with how best to run this blog. I wrote about it already, but I still never answered my own question.

So I’m going to unshackle myself a bit. Moving forward, I’ll be sharing things I learn – random, and untethered to a single category. Because that’s what’s interesting to me. Sometimes it’ll be Salesforce related, or technology related, or project management related, or…whatever I learned.

That’s what I’m taking away from TDX19, and I’m already looking forward to next year.

Live from Dreamforce

It’s Wednesday – halfway through Dreamforce, and I’m returning from a day and evening of volunteering, playing Dungeons and Dragons, and having dinner with some of my absolute favorite people.

I look back on my first Dreamforce, and I look at where I am today, and I still can’t believe it. How is this my life? How did I get so lucky?

Not to say that it comes for free. I work hard, and I work a lot, but I enjoy my work, and part of my career is experiencing this event (and others like it) every year.

One of the first things I was asked to do this year was fill out a gratitude card – what am I grateful for?

This. All of it. I’m just grateful.

Online Proctoring: My Horror Story

I enjoy my creature comforts. I like working from my couch some days, with blankets all bundled around me, feet propped up, and a cup of coffee nearby. Most importantly I like all of those things in my own house. If offered an opportunity to get coffee at a fancy coffeeshop or make myself a cup of Chock Full O’ Nuts at home, I’m going to pick home. Every time.

So when I learned that certification could be done from home, those many years ago, I signed up immediately. The first online proctored exam I took was not actually for Salesforce. It was my Marketo Certified Expert exam, and I took it in December after signing up for a training course that came with a voucher. I figured it couldn’t hurt. And given that December is prime time for crap weather, I was excited, despite the “it’s not awesome” warnings available online. How bad could it be?

Well…

First my webcam just stopped working. It had been fine, doing its thing, and literally just before it was time for me to sit down and show my stuff, it stopped.

Kryterion was super chill. Their support team rescheduled my exam for an hour later, and I ran out to get a new webcam. Done.

Fun fact: new webcams are better than old webcams. The resolution on my new one was too good, in that it couldn’t match my face because the old picture I had on file for facial recognition didn’t have as high a resolution.

No worries. Super awesome support team reset that. Face recognized. Typing recognized. It was time to take the test. Aced it.

When it came time to take my first Salesforce exam, I figured I had worked out the kinks and could handle anything.

Well…

I just couldn’t log in! After about three or four attempts, calling support, and still not being able to access my exam, we discovered there was a server error on their side. They told me they would reschedule my exam (for free, again, thank you super awesome support team!) and call me when I would be able to log in.

I made myself a drink and watched an episode of the Office. I was halfway through my vodka-cran when they called and said I could get started. Aced it.

I took a few onsite exams after that. Switching it up, I guess. But the testing location was not a huge step up from the headaches I’d had at home, so it was back to online for me.

Testing with a Mac is different. Testing with the new MacBook Pro (with its nearly universally despised Thunderbolt 3 ONLY connections) is actually impossible. Literally. If your external webcam (which you have to use) is connected via a dongle (which is has to be), the feed won’t go through.

For my Pardot exam, it took us about 2 hours to troubleshoot. If not for the super awesome support team at Kryterion, I would still be in the fetal position upstairs. I ended up needing to use the gaming computer to take my exam. Sweet graphics, anyway. I still had to stop like five times to adjust where the camera was or the microphone volume, or whatever.

I’m really not trying to scare you off. Legitimately not my purpose here. But I want you to KNOW what you’re getting into, if you go the online route.

First of all, your test may go way smoother. I had at least two that went off without a hitch. But just in case, keep these things in mind:

  1. If you have a brand new MacBook Pro, just plan on taking the exam onsite or with a cheap-o PC you pick up at Best Buy for like $200.
  2. When they say that you should buy their specific webcam…consider it. I didn’t. I had to buy one last minute, and I just wasn’t going to reschedule. But they have one that works, so you might as well.
  3. Download Sentinel and do your “biometric scan” in advance but not TOO in advance. Like two or three days beforehand is fine. But if you sign up for the exam in June to take in November, just wait.
  4. Be prepared to spend some time getting INTO the exam.
  5. Be prepared to be interrupted DURING the exam to fix something.
  6. Lean heavily on the support staff there. They really are awesome, really patient, and they have the answers.
  7. Be NICE to the support staff. Their job sucks. They just watch a bunch of under-dressed, maybe showered, work-from-home people take exams and get mad all day. And they can help.
  8. Maybe make a drink beforehand?
  9. Definitely eat beforehand – it might be HOURS before you get another chance.
  10. Be prepared to retake the exam. After fighting with computers and getting interrupted and feeling like NOTHING YOU DO IS WORKING, you might not be in the best place to take an exam…so be patient with yourself, too.

Maybe I’m a glutton for punishment, but I’ll probably continue doing the online proctored exams. That is how much I hate driving in snow.

 

DnDF17 Episode 2: Everything must be dwarf

Previously on DnDF17…

The members of Bacon Ipsum stared in growing horror at the flames consuming Moscone.

Datatello’s concern heightened with each area he recognized, but his eyes focused on his own neighborhood, wondering if his sister, Erikuhl, was safe.

Bakaryu had to use all of her mental discipline to stay put, seeing the glow and smoke from the Temple district.

Trailblazer turned away to seek Dirk in the crowd. Their handler had his head held down to his wrist, shaking it and prodding it, his visage one of consternation. She approached, waving vaguely at the door, “Where do you need us?”

“What?”

“I assume everyone’s scrambling at this point, but what are our orders?”

His eyes narrowed, “I’m not getting anything. What are you talking about?”

Perhaps just as confused as he clearly was, she pointed out the still-open door, hoping that the fires raging through the streets would be indicative enough of her question. His eyes widened, and he looked back at her, “They must have hit Site 14. Where are you going?”

This felt like some terrible comedy bit, and the timing was awful, “I don’t know! Where do you need us?”

He shook his head again, considered a moment, then reached into a pouch and tossed her a wrist brace similar to his, “Here. Take this. When Site 14 is back up and running, you’ll need to know what the plan is.”

He approached the prone, metal dwarf and leaned down to inspect. To Trailblazer’s horror, two needles rose from his chest and struck Dirk in the hand. Her years of surviving in the wilderness made it clear that this was poison, but no matter her abilities, she couldn’t pinpoint it.

“I’m fine! Go!”

With a frustrated shout to the patrons to look after him, Trailblazer joined the others, “The system is down. We have no orders.”

Even as she said it, as she listened to her companions’ reports, she saw the glow in the distance and knew that her mentor’s shop was, if not already burning, in danger of doing so soon. She focused on the reports, and nodded, “We need to get to the residential area first. The Temples have more power to stop this. We’ll go around in a loop.”

Datatello had already hopped onto his magical, rolling board and was heading toward his home, the others following. Erikuhl, his sister, was waiting, waving frantically when she recognized him.

“Are you ok?”

“Fine, I’m fine.”

“What about the kids?”

“They’re…” she trailed off, her eyes unfocused, as she tried to think – there were flames and children, and the children needed to be…led away from the flame. She had done that, yes. She nodded, “Yes, they are safe.”

“What happened here?”

“Dwarves! Large dwarves,” she started, rummaging through a pack and shoving things into his hands, “Take these!”

He looked down to see a pair of bracers and a necklace, a kind of upside down triangle with something carved into it. He had barely any time to don them, for lack of a place to put them otherwise at least, before three dwarves, large and covered in metal like the one Master of Coffee, turned in unison and began stalking toward them.

Things swiftly fell to chaos. Coming up swiftly behind Datatello, Kriv summoned fire and hurled it at the oncoming monstrosities. Either unprepared or unconcerned, the dwarves seemed to simply walk into the new flames. Bakaryu sprinted forward, first to ensure that neither Datatello nor Erikuhl were similarly engulfed in flame, and to open her maw and breathe a rolling ball of energy onto their attackers.

Datatello had retrieved his juggling balls, spinning them through the air; they gained momentum, as his companions attacked, and when he knew they were clear, he made his attacks, “You guys shouldn’t play with fire! You could get hurt that way!”

One of the weighted spheres flew directly at the dwarf closest to him, knocking into its head. It turned to stare quietly at him, and the half-orc moved closer to attack, punching him in his jaw. The dwarf had no reaction, but there was a definite sting in his own hand.

Trailblazer, astride Cloudy, came up behind the party. She took aim with her bow, the goat’s added height making it possible for her to use her longbow. The arrow shot out, whistling through the air to bury itself in the eye of the dwarf Datatello had just angered.  In the time that it flew, she drew another arrow. Before it cleared Cloudy’s head, the goat twisted and caught the arrow, chewing on the wood thoughtfully. Trailblazer stared at her, feeling betrayed.

Arrow still in its eye, the dwarf still stared at Datatello, its hand starting to shudder, opening and closing with a strange regularity, as if on a spring. The dwarf behind it, prone, lifted back to standing, like a fulcrum. Once straight again, he reached behind, drawing a battle-ax from its back. The axe grew, extending both the handle and its blades – blades that started to spin wildly.

The dwarf took a step and swung the spiraling blade at Datatello, slashing into the half-orc hard enough that the monk stepped back, inadvertently dodging the second blow.

The third dwarf standing near Bakaryu held up his arm, his hand popping down, as if on a hinge, and a circular blade came out, spinning menacingly. Before he lunged, he turned, seeing Trailblazer. He turned and started toward her.

Kriv’s eyes narrowed, seeing the change in direction, and lashed out, a blast of electricity arcing through the air toward their attackers. All but the potential leader, wielding the battle-ax, seized suddenly, then fell unceremoniously to the ground.

The leader turned toward his attacker and began stalking toward Trailblazer, a well. Bakaryu acted immediately, stepping in front of him and driving forward with her sword. The dwarf looked at the sword, taking a step forward, still staring at Trailblazer.

Another step.

And he fell slack on the blade.

The team looked around, Bakaryu looking over at her dwarf companion, who was muttering about nightmares, “Maybe you should wear a disguise or something.”

“So Ryu, ask me if I have anything that would work as a disguise for Trailblazer.”

Datatello grinned, “This is a joke he’s been telling lately. I don’t really get it, but it is pretty funny.”

The paladin smiled, “Ok. Kriv, do you have something that we could use as a disguise for Brunhilde?”

Kriv reached into his cloak, digging around a bit, before pulling out a large cloak. It was clearly too large for the dwarf, but it would most certainly hide her from view. He handed it over, “Try this on. If it’s too long, maybe Cloudy will hem it up for you.”

Datatello watched all of it joyfully, “I don’t know what you’re paying for your magic classes, but it’s worth it.”

The others looked at him, but he went peacefully into a meditation. He twirled then brought his quarterstaff down, shouting his holy cry, feeling his body start to heal.

“Maybe you should ask if the wizard has a health potion,” Kriv offered helpfully, frowning when his cloak came into view. The corner snapped him in the face.

“It was a genuine ask,” he grumbled. The corner snapped him the other way.

Bakaryu, realizing that her companion was still injured approached, reaching out to offer him healing.

With the battle over, and the healing done, the group looked around to see the fires creeping in. Kriv cleared his throat, “Wouldn’t it be great if we had some sort of hose and a never-ending supply of water to help put out this fire.”

Datatello smiled, “Ok. Kriv, do you have a hose that we can use to put out this fire?”

The wizard sighed, “It’s not as useful if we don’t have water.” He gestured, as he spoke, a tube started falling out of his robe, and with each gesture, more fell out.

“I recognize this! But listen, Kriv, this isn’t a time for joke.”

Trailblazer shook her head, “Datatello, you live around here – do you know anyone who can help us put this out, so we can continue on?”

A grunting sound, followed by hands waving, became apparent, as Erikuhl started to shout, “I can help!”

She grabbed the tube coming out of Kriv’s cloak and began to run, pulling it. It continued to flow until, finally, the end popped out.

“We need a water source,” Kriv sighed.

Datatello made his way to a nearby entry to the aqueduct below them, while Kriv’s cloak dropped another hose out, as if annoyed. They connected the hoses and, after some additional work and questions, they had a pump to bring water out of the sewer and toward the fire.

They took a moment, breathing deeply and centering themselves, trying to not think about the city burning around them. At some unspoken agreement, they headed out again, Trailblazer gesturing, “Let’s get to the template district.”

A little over halfway there, they came across a dwarf sprawled on the ground, black, spiderwebbed marks on his face, as he struggled to breathe. Datatello called Trailblazer over, and she approached, recognizing him immediately as Wuric, a traveling merchant who had the displeasure of being in town.

“Kill me,” he begged, through harsh breaths, clearly unable to move otherwise, “Please. Please. I don’t want…this.”

She could see the black poison in his skin spreading, the same as Dirk, and Trailblazer waved to Bakaryu, “I need…I’ve seen this before. I don’t know what kind of poison it is.”

The dragonborn approached, holding her holy symbol in her hand and kneeling. She channeled the power of the storm through her, focusing it and shaping it, as she reached down to place her hands on his chest.

Before Trailblazer could shout, to warn her, two needles whipped out, just as they had in the Master of Coffee, but they stopped, evaporating. The black lines on Wuric’s face began to recede; his breathing returned, even and steady, and finally the only indication of his previous condition were two pinpricks on his cheek.

“What happened?”

“Dwarves. Some dwarves attacked,” he muttered, sitting slowly, “focused on dwarves, but they attacked everything. I fend them off as best I could, but something got me with some poison, I guess. I couldn’t do anything. I felt my mind retreating, like I was losing grip of it, like I was being pushed to the back. And there was…this voice. So loud. It just said…all things must be dwarf,” he finished, shaking his head.

Kriv approached then, hand raised, “Still want us to kill you?”

The dwarf blinked rapidly, “No! No, no. I’m ok now.”

As her companions spoke, Bakaryu concentrated on the poison that she had just cleansed. It felt…like power of the undead. Her sense of the divine made it clear, the clawing sense of evil dissipating, along with the poison in the dwarf before her.

“Were the dwarves strange looking?” Trailblazer asked, rubbing her face.

In answer, Wuric began gingerly removing chainmail, asking her for help. While the black had receded, there was already metal plating across his chest. She nearly recoiled but steeled herself, leaning forward. It looked like iron. The aura itself was faint, and growing fainter, but it was there.

“When did this start?” Trailblazer asked.

He shrugged, “Never had it before.”

“How long ago were you attacked?”

“Hard to say when all you know is pain. Every moment is an eternity when you’re in agony.”

No one said anything, and Trailblazer looked bemused.

“Was that too dramatic?”

Datatello scaled a building, feeling that he needed to watch for any further bad news. The fires seemed to have died down, or at least not spread, much to his relief. As he scanned, he saw pockets of dwarves, all heading in the same direction – not speaking, not showing signs of camaraderie, simply…marching.

Trailblazer helped Wuric up, eying the abandoned cart of TaskRays and nodded toward it, “You should get out of town.”

He nodded, taking up his cart, and waving, “Thank you. I, uh, I owe you.”

As the dwarf retreated into the distance, Trailblazer turned back to the party, “So let’s get you to your temple,” she grinned at Bakaryu.

They were close, so it wasn’t long before they entered the courtyard of the temple district, all centered on the towering statue of a flower, multi-colored with the stones and metals that made it. Many of the temples were untouched, but damage had been done to both the Temple of the Maker and Temple of the Storm. Puddles of water surrounded them, clearly the work of magic.

The Temple of the Maker was razed to the ground.

Bakaryu approached the Temple of the Storm, where Longshore, a bronze dragonborn that she knew through the temple was finishing some work.

“You made it, Ryu,” she breathed.

“Yes, I made it. What…happened here?”

“You knew? The dwarves. They came. They did not bring the love. They brought only pain and poison. You’ve seen the poison?”

“Yes – we healed one of them, on the way here.”

“How so?”

“Restoration,” she shrugged, unsure how else to explain it.

“Oh? Good to know that something so simple can do so much good. I will send word.”

“It seems to be undead in nature.”

Longshore nodded, “Yes, we sensed that as well.”

Trailblazer approached, then, “Are they attacking non-dwarves”

The other dragonborn frowned, “They focused on the dwarves. They came and went directly to the temple of the maker. One of them called them traitors, called them…undwarfish.”

Kriv nodded, “A very short conversation.”

Longshore said nothing to the wizard, “He said they were…bringing down, or, no, taking away from dwarves society by trying to allow others to be equal to dwarves. That dwarves were superior, and that if others could not live up to their standards, then they should live in the dirt.”

Datatello pointed, “Did they go in that direction, when they left?”

Longshore nodded, “Yes.”

The other party members turned to look in the direction, trying to determine what they could be headed toward. No one could put their finger on what they could be headed toward – it seemed innocuous. But they knew, at least, that that was the direction they needed to head in.

DnDF17: The adventure so far

Last week, on DnDF17 (some artistic liberties have been taken)

The weary members of Bacon Ipsum wound through the streets of Moscone. They were silent, all of them thinking only of the destination and what would await them there – the best coffee in Forcelandia and payment for their efforts defeating what may or may not have been a dragon. What was definitely not a dragon. What had definitely been someone with too much time on their hands. Either way, the team would be paid through the Trailhead Expeditionary Forces.

The Apex palace loomed before them, the Master of Coffee nestled within its walls, when Kriv, the surly and aloof wizard heard his name being called. The rest of the team paused, waiting for their companion to complete his transaction, all of them on edge at the rough tones of the conversation. Brunhilde, the dwarf better known as Trailblazer, watched and waited, ready to jump in and pull the wizard out of a scuffle.

“Oh, hey, guys,” Datatello suddenly began at her side, pulling her attention away from hearing what words were being exchanged, “I just remembered! Remember those crystal shards that we found in that basement a long time ago?”

Kriv and Brunhilde remembered, of course, having been part of their first adventure. Bakaryu and Flash both nodded politely, not wanting to correct the half-orc. After all, they had all traveled long enough, it was easy to forget who was where and for what.

“I sold them!”

Kriv straightened under his robe, hearing the words sold, as he approached the group once more.

“I found a buyer at the Wizard School, and this guy bought them for 600 gold!”

“600 gold?” Kriv began.

“Yeah! I gave it to a children’s hospital,” Datatello beamed.

Kriv shriveled within his cowl, “You gave it away?”

“Not all of it,” the half-orc continued, producing pouches from his bag and handing them out, “here’s what’s was left.”

The party entered Master of Coffee, placing orders and taking their respective places at a table large enough to seat them all.

“We should check in,” Kriv muttered, waving for Bakaryu to follow. It was best that others be with him when dealing with their handler, and the noble paladin was a good choice, despite her looming presence and scaled visage.

Their handler sat in the back, clothed in all black, peering at them from behind half-moon spectacles, “Yes?”

“We’re checking in,” Kriv spat, his mood only darkening after the exchange he shared with his supplier, Quick. His problem was becoming increasingly expensive, and he just wanted to take on the next job. And the next. However many it took.

“I suppose you have evidence, then?”

Something like a growl left the wizard, as he turned and stalked back toward his dwarf companion, who was staring into the steaming mug in front of her and watching Datatello request other patrons join him in a game of darts. She had offered, but experience had proven that her height put her at somewhat of a disadvantage for the monk’s preferred play style, specifically another player throwing a dart at his face, so he could deflect it.

He was, perhaps unsurprisingly, very good at the game.

“Do we have any evidence from the last job?”

“Dragon scales,” she leveled at Kriv, taking a sip.

The words sparked the memory of their dragon born compatriot, who smiled widely – probably smiled; the teeth made it difficult to tell – and presented a bag, “Oh yes! The dragon scales.”

Satisfied, their handler nodded, “500 gold then.”

Brunhilde saw Kriv’s jaw clench, “500? Fine. Well what’s the next job?”

“There is not one.”

Apparently things were quiet. Too quiet. They would swiftly become much louder, if Kriv had nothing to occupy himself with. Trailblazer prepared to talk him from the ledge, shove something free in front of him and distract him, but the planning was unnecessary, as just at that moment, the door opened, and the loud thumping of heavy boots rang through the air.

The coffee tavern, as a whole, turned to watch a group of angry dwarves step inside. They were known to Brunhilde, the one at the fore a known rabble rouser, and to her surprise, a usually friendly Skuid vendor from the markets. Friendly or no, it was clear this group was looking for trouble.

The friendly monk approached, hoping to calm whatever had the dwarves so angry, “Hello there! Can I offer you a beverage?”

“Ale,” the leader growled at Master Coffee.

Master Coffee smiled calmly, “I’m afraid we don’t sell ale here.”

“What kind of tavern is this?”

Datatello watched the exchange, clearly uncomfortable with the tone. Kriv, too, saw the tension rising.

“Datatello, ask me for ale.”

The half-orc tilted his head, “I don’t need it. They’re-”

“Just ask me for ale. Tell me you need ale. Ask me for ale!”

Unsure what the wizard was on about, but not wishing to disappoint, he complied, “Kriv, can I get some ale?”

The wizard reached into his robe, digging around for a moment, before pulling out a smallish barrel and showing it to the dwarves, as well as the proprietor, “Here. Ale. Please open the barrel.”

Master Coffee didn’t seem pleased with the idea, but he agreed. Kriv placed the barrel on the counter and stepped away, just before an axe whizzed through the air and shattered the wooden cask.

Moving on instinct, Kriv raised his hand, fire springing from his palm to shoot directly at the dwarf who had thrown the axe. The smell of burnt dwarven beard followed, as well the angry shout of alarm and the sound of many heavy weapons being drawn from their scabbards and holsters.

It was enough for Datatello. The half-orc pulled his bo-staff free, swiping high and then low against the dwarf just in front of him before moving beyond him to stun the second armed intruder. He was caught on the calf with a blade but elected to ignore it, the cut barely registering, as he left open-handed strikes on his attacker.

There was a brief pause, as Bakaryu stood, looking down at the dwarves, “Listen, friends, let’s not be short sighted here. I understand that tempers may be short, but fighting is only a short-term solution. I’m sure there’s a way to short – oh, no, sort – this out, so that everyone gets what they want, and we can all go our separate ways shortly.”

Flash, their silent thief, ducked into the shadows, hoping to remain unseen until he could strike.

Brunhilde blinked at the calm, reassuring dragon born, wincing with each passing moment. Other dwarves, who had been ducked behind tables to avoid being caught in the fray, stood to level shocked glares at the paladin.

Before the angry, at least no longer flaming, leader could roar and charge at her companion, Brunhilde slid her longbow around and lifted it, tilted to ensure she could use it, and took aim. The arrow soared through the air and struck its intended target – the thick rope holding onto a strange contraption, unique to this establishment, with wooden blades than spun lazily through the air. The rope snapped, and the heavy instrument fell, knocking into the dwarf’s shoulder and sending him to the ground, though it did not knock him out.

That was a mistake.

The dwarf stared at her, recognition sparked, and he bellowed toward the door, “SHE’S HERE!”

The spectacle served as enough of a distraction, though. Flash leapt from the shadows, his sights on the dwarf who was still stunned by Datatello’s flurry of blows. It was all he needed, taking two swipes, enough that the dwarf staggered away.

Ignoring his companion in need, the dwarf who had just yelled sprinted, or at least lunged forward. Brunhilde watched as the attacker, and her past, rushed to greet her. He didn’t make it to her, though, instead tripping. Her relief was short-lived, as behind came another attacker, this one wielding two axes, both of which came down swiftly and lodged deep in her chest.

She grunted, unable to pull away, then staggered when the dwarf ripped the blades back out. Pain blossomed, and she at first thought the shaking of the wooden planks beneath her were her imagination until she saw the hulking form coming through the doorway.

All patrons stopped and stared at the dwarf entering the coffee tavern, if one could still call this creature a dwarf. Parts of his body had been covered in ore, as if he had been dipped in molten metal and left to cool, or something blew up and fused to his skin. He turned to Trailblazer, “Traitors die a terrible death,” he rumbled.

Never one to standby, when the shock wore off, Datatello sprung into action, launching his magical rolling board at one of the stocky attackers who had hurt his friend. It did little to deter their enemy, but it was of little concern. He swung back with his hand, feeling the distinct crunch of crushing bone under his palm, followed by the sound of someone gasping for breath.

“Someone throw me an alley-oop!” the monk shouted.

For a breath, nothing happened. Then the half-orc, Sodak, popped out from a table, tossing a dart. Datatello spun, kicking the dart furiously. It turned and sped toward the new-comer, only to ping uselessly against the metal coating on his skin.

Bakaryu rushed past the remaining combatants, ignoring the dwarf that ran into her, only to bounce off again with a grimace. She inhaled deeply, rearing back, then opened her mouth again, a purple and blue cloud of writhing electricity spitting out at the intruder. The tendrils wrapped around him, sparking to life, then fizzling out. He choked for a moment, enough time for her to hurl a nearby table. He stood and shook off the energy in time to watch the table soar overhead and crash through the window behind him.

He ignored both attackers, his focus still intent on Brunhilde, as he took floor-rattling steps toward her.

“You are a disgrace to your kind,” he spat, “First you took the dishonorable path of a role not meant for you. Then you abandoned that path for an even less honorable path.

THUMP. THUMP.

“And now you sit in a tavern that does not even serve ale!”

THUMP. THUMP.

“You have usurped your rightful place.”

THUMP. THUMP.

“You are a crime with your very existence.”

THUMP. THUMP.

As he approached, the remains of his face became clear, and Trailblazer realized who this dwarf was, why he was angry, rambling and intent on destroying her. Eric the Unready.

Maybe it was the pain or the blood loss, but all she could think to say was, “Eric, hey. How are you?”

He blinked at her, “I – what?”

It was enough time for her to take action. She kicked Datatello’s magical rolling board at him, as he took a step, hoping to trip him. His foot landed on the wooden board, and as he brought up his other foot, he lost his forward momentum, though not his balance. Brunhilde watched, as he rolled slowly back away from her, his low center of gravity keeping him upright, but the momentum of the board enough to carry him at least a few feet away.

Sodak, still peeking out from behind the table, stuck out a leg.

Eric toppled onto his back with a roar, and Trailblazer, eyes narrowed, swung out with her short sword at the closest thing still nearby, the dwarf who had nearly cleaved her. He grabbed at his throat and fell away.

Seeing his opportunity, Flash narrowed his eyes at the monstrosity on the floor. The metal and stone had him still prone, rolling in an effort to stand. Before he could, Flash moved with the speed he had been nicknamed for, trusty daggers in hand.

As the dwarf stood, Flash dropped, sliding past him on the floor to dig one biting dagger into the behemoth’s back.

Eric the Unready roared and swung back with his left arm. Flash ducked, leaning back and then lunging with his remaining blade, sliding it under the dwarf’s arm to lodge firmly in his chest. Eric stumbled back, gurgled, and then fell to the floor, unmoving.

The remaining dwarves took their cue, rushing out of the tavern.

Through the open door, they all saw it. Smoke and flames.

Moscone was burning.

It’s that time again!

Last year I did a thing to help raise money for ExtraLife, and I introduced the world to Brunhilda Battlehammer, AKA Trailblazer, AKA my dwarf ranger character for DnDF16.

tblzr
THIS dwarf ranger

I have news for you all…

SHE IS BACK WITH A VENGEANCE! And by vengeance, I simply mean that I will be reprising this role for DnDF17!

Shame on me, late to the party and such, but if you’re curious/interested/want to watch me and some of my Salesforce friends do this thing…it starts TONIGHT at 9pm EST!

Details here: https://cloudforcecollective.com/dndf17/

And, perhaps most importantly, why are we doing this? Yes, it’s fun. Yes, it’s an excuse to hang out virtually with some of my favorite people. But it’s also a really important thing we’re doing. This is part of the ExtraLife fundraising initiative, a nonprofit that allows gamers (like me) to give back to something that matters.

Here’s why we’re participating: https://cloudforcecollective.com/2017/10/16/ddf17-why/