Monday, April 6, 2020

Writing a compelling narrative

Writing a compelling narrative

The narrative outlines a thesis on how to make people’s lives better. A clear narrative helps with prioritizing features, communicate about the product effectively and hone in on the most important niche. Every field in the narrative is testable from day one.

For ___[target audience], it’s a constant challenge to ___[general problem]. Every ___[time period], these people ___[perform a key activity] in order to ___[achieve a primary goal]. This is especially true if you’re a [niche].
The main problem they face is ___[primary functional problem relating to activity] which leads to ___[bad/worst case outcomes]. Today, their best option is ___[substitutes], but of course, they ___[the most common complaints of each substitute]. With ___[key trend], the problem will only get worse over time.
If only there was a easier/better/cheaper way to ___[perform a key activity], then customers could ___[quantifiable impact on their primary goal] which would lead to ___[positive outcomes / emotions]. With ___[number of potential customers], there is a clear opportunity to meaningfully impact a huge number of people.

How you can fill in the blanks for the narrative?:
  • Target audience: B2C: Who are your target customers? B2B: Who actually uses your product?
  • General problem: What’s a problem that every target customer can agree with (e.g., not enough time or money)?
  • Key activity: What are customers doing (actions) while they use your product (e.g., booking flights or collecting receipts)?
  • Primary goal: What’s the end-goal of performing this activity (e.g., travel abroad, or prepare a VAT return)?
  • Niche: Which sub-group of potential customers is most likely to be an early-adopter?
  • Primary functional problem: What’s the hardest part about doing the activity today?
  • Bad/worst case outcomes: What’s the worst case scenario if the activity goes wrong? What is the negative business impact?
  • Substitutes: What’s the next-best-option or workaround?
  • Most common complaints: Why do customers hate these substitutes?
  • Key trend: What will make this problem worse in the future?
  • Quantifiable impact: How can you measure the impact of solving the problem?
  • Positive outcomes and emotions: What good things happen as a result? What is the positive business impact?
  • Number of potential customers: How many people can you target?

Saturday, February 4, 2017

Productivity: Google spreadsheet plugin hack sending mass emails with dynamic template


How this hack is going to help?
  • If you have a list of email address to which you want to one email with custom message/email body then this hack will help with that.
  • Mass email campaign is a good example of this 
  • Single email notifications to a group of email addresses
STEP-1: Create a google spreadhseet with two sheets.
1. 1st sheet (Sheet Name: EmailList): have the following columns: (export the email data and store in the below format)
    -- Email Address
    -- First Name
    -- Last Name
and
     2nd sheet (Sheet Name: SendEmail): have the following columns:
     -- Email (Formula: =EmailList!A2)
     -- Message (Formula: =CONCATENATE(C2, CHAR(10),CHAR(10), G2, CHAR(10),CHAR(10), "Thanks,",CHAR(10),H2))
     -- Sub Message (Formula: =CONCATENATE("Hello ",E2, ", "))
     -- Full Name (Formula: =CONCATENATE(E2," ", F2))
     -- First Name (Formula: =EmailList!B2)
     -- Last Name (Formula: =EmailList!C2)
     -- Email Template Content (Store Email body/template)
     -- From Name (Store from name)
STEP-2: Copy paste the formula to multiple rows
STEP-3: Go to menu->Tools->Script Editor and paste the following code snippet
/**
* @description Google Spreadsheets plugin to bulk email
*/

function onInstall(){
  onOpen();
}

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [   {name: "Send Bulk Emails", functionName: "sendbulkEmails"},
                    ];
  ss.addMenu("Send Bulk Email", menuEntries);
}


function sendbulkEmails() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;  // First row of data to process
  var numRows = 2;   // Number of rows to process
  // Fetch the range of cells A2:B5
  var dataRange = sheet.getRange(startRow, 1, numRows, 5)
  // Fetch values for each row in the Range.
  var data = dataRange.getValues();
  for (i in data) {
    var row = data[i];
    var emailAddress = row[0];  // First column
    var message = row[1];       // Second column
    var subject = "Sending emails from a Spreadsheet";
    MailApp.sendEmail(emailAddress, subject, message);
  }
}
STEP-4: Save the script with "BulkEmail" project name.
STEP-5: Come back to spreadsheet refresh the page and you will see the "Send Bulk Email" menu. Clicking the menu link will send the mass emails to the all the rows selected in the script.

Screenshots:

Sunday, January 8, 2017

Productivity: Case email bounce back analysis by querying, parsing result and printing to CSV from Salesforce.com Developer console

Use-case: Case email bounce back analysis by querying, parsing the result and printing to CSV using a single code snippet from Salesforce.com Developer console #Productivity

What the following sample script does?: 1) Queries for the undelivered emails resulted in cases created via "Email to case".
 2) Parses the bounced emails from the result
 3) Prints the modified results on CSV which will be stored in Salesforce.com Files.
 4) The code can be run from salesforce.com developer console in a short time and does not need to be maintained on the salesforce.com platform.

Sample script:
String csv = 'Id,Description,EmailAddress\n';
          String regex = '>>> ([a-zA-Z0-9_\\-\\.]+)@(((\\[a-z]{1,3}\\.[a-z]{1,3}\\.[a-z]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3}))';
         Pattern myPattern = Pattern.compile(regex );

for ( Case cas : [ Select Id,Description
from Case
where <<filter conditions>>
order by createddate asc limit 10]
) {
Matcher myMatcher = myPattern.matcher(acct.description.escapeCsv());
if (myMatcher.find())
       csv += cas.id + ',' + cas.description.escapeCsv() + ',' + myMatcher.group().split('>>> ')[1].trim() + '\n';
else
      csv += cas.id + ',' + cas.description.escapeCsv() + ',' + '' + '\n';

}

ContentVersion file = new ContentVersion(
title = 'cases.csv',
versionData = Blob.valueOf( csv ),
pathOnClient = '/cases.csv'
);

insert file;
System.debug('this is file:' + file );