Build a Google Action with Node.js and Jovo
Google Conversational Actions let you build voice experiences for Google Assistant across phones, smart speakers, and smart displays. In this tutorial, we'll use the Jovo Framework to build one from scratch using the same TypeScript codebase you'd use for an Alexa Skill.
What you'll learn
- ✓ Setting up a Jovo project with the Google Assistant plugin
- ✓ Mapping intents between Jovo and Dialogflow
- ✓ Using Suggestion Chips and Rich Responses
- ✓ Deploying to Google Cloud Functions
Step 1: Create a New Jovo Project
$ jovo new my-google-action --platform googleAssistant
$ cd my-google-action
The --platform googleAssistant flag configures the project with the Google Assistant platform plugin, Dialogflow NLU integration, and a sample language model compatible with Google's intent system.
Step 2: Configure Dialogflow
Google Actions rely on Dialogflow for natural language understanding. Jovo handles the Dialogflow agent configuration automatically when you run jovo build:
$ jovo build --platform googleAssistant
# Generates Dialogflow agent files in /platforms/
This creates Dialogflow agent JSON files from your Jovo Language Model. Intents, entities, and training phrases are all mapped automatically — no need to manually configure them in the Dialogflow console.
Step 3: Add Suggestion Chips
Google Assistant supports rich visual responses like Suggestion Chips. In Jovo, you can add them through the output template system. For a deep dive into Suggestion Chips, see our dedicated guide.
LAUNCH() {
return this.$send({
message: 'Hi! What would you like to do?',
platforms: {
googleAssistant: {
nativeResponse: {
suggestions: [
{ title: 'Play Quiz' },
{ title: 'Tell me a joke' }
]
}
}
}
});
}
Step 4: Deploy
$ jovo deploy --platform googleAssistant
This uploads your Dialogflow agent and webhook endpoint to Google Cloud. You can then test your Action in the Actions Console simulator.
Cross-Platform Bonus
Because you built this with Jovo, you can add Alexa support by installing the Alexa plugin — no code rewrites needed: