Category Archives: Product Updates

Zendesk Agent Scripting App – Version 10

If you’re a Zendesk user in a Contact Center environment,  you’ll want to be using our Zendesk Agent Scripting app.  This makes it easy to guide, train and onboard agents and is a huge productivity booster for everyone.

The Agent Scripting app appears as a button in the right-hand panel:

Click Open Script, and you’ll see your decision tree in a pop-over like this:

If another agent picks up the ticket, they return to the last viewed node, and can see each step taken previously by opening the History:

 

Benefits of the Zendesk Agent Scripting App

  • Standardization: Show a guided path for each ticket, so that Agents follow the proper operating policies or troubleshooting procedures.
  • Pause and Resume: If a ticket is transferred, the supervisor or new agent is taken to the last place in the script, and can see the history of the previous steps taken.
  • Automatic Script Selection: The Agent Scripting App can choose a script based upon the Zendesk brand, Zendesk ticket tags, or the value of a custom field.
  • Agent Feedback: Agents can send feedback directly to the authors of the decision trees with a single button click. Feedback is delivered to each author’s email, and includes the tree ID and node number where the feedback was sent from.
  • Automatic Ticket Updating: Tags and custom fields in the ticket can be updated from actions in the script – either via buttons clicked in the script, or from data entry collected.

New Features in Version 10

If  you’re using a previous version of the Zendesk Agent Scripting app, you may want to upgrade to take advantages of these new benefits:

  • Pop-overs: Scripts now appear as pop-overs, rather than being constrained to the right-hand panel.
  • Ticket Updating: Your tickets can automatically update by navigating the script, or by entering data into Zingtree Data Entry Fields. For example, the start of your script could offer the agent a choice of a product, and the “product” field in your ticket will be automatically selected when the agent makes a choice.

Note: Don’t remove the current version of Agent Scripting until you are ready to make the switch. Versions 9 and earlier may not be updated going forward.

Demo Video

This two minute video shows you how Agents interact with the Agent Scripting App:

 

Getting Started

Here are the basic steps to get up and running:

  1. Build an interactive decision tree script with Zingtree (or use one of our demos to start).
  2. Install the Agent Scripting App (version 10) into Zendesk.
  3. Configure the Agent Scripting app within Zendesk.
  4. If you want to have your decision tree scripts update your  Zendesk tickets, you’ll need to add variables and/or tags to your Zingtree tree to match your Zendesk setup.
  5. If you want to enable automatic script selection, you’ll need to add tags to your trees in Zingtree and configure the Zendesk Agent Scripting app properly.

Installing the Agent Scripting App into Zendesk

Download and configure the Zendesk Agent Scripting App version 10 like so:

  1. Download the Agent Scripting app here.
  2. In Zendesk, click the Admin icon and go to Apps > Manage.

  3. Click Upload Private App.

  4. The Upload App page appears.

  5. Enter “Zingtree Agent Scripting” for the App Name.
  6. For App File, locate the file zingtree-agent-scripting-v10.zip you downloaded in step 1.
  7. Click Upload, then confirm if necessary.

Configuring the App

Once you’ve uploaded the app, click App Configuration to see the configuration screen:

Here’s what each item does:

Tree ID: This is the default tree that appears when agents click “Open Script”.  (You should always have a default tree.)

Hide Integration Setup Info: When you are setting up Agent Scripting for the first time, you may need some information about your Zendesk setup to take advantage of automatically updating ticket fields. An “Integration Setup Info” link appears by default when you first install the app, and ticking this option hides it.

Match Tree Tags to Zendesk Brand: If this option is checked, the subdomain of the selected brand will be matched to a Zingtree tree tag.  Any matching tree or trees will appear.  For example, if the brand subdomain is xyz.zendesk.com, any trees tagged as xyz (using the Zingtree Settings tool) will appear.

Match Tree Tags to Zendesk Ticket Tags: If checked, the values in the Zendesk ticket tags will be matched with your Zingtree tree tags (set via the Zingtree Settings tool) to show one or more matching scripts.

Match Tree Tags to values in a Custom field: If you want to use a custom field value to show matching scripts, enter the Zendesk custom field identifier here. The field name can be found using the Integration Setup Info link that first appears in the sidebar when you install the app.

Zingtree API key: Each organization in Zingtree has an API key, which is used to match scripts. If you’re using one of the tag matching options, this is required. Your API key can be found at zingtree.com under Help, API.

Enabling Automatic Script Selection

Automatic Script Selection works by matching tree tags you set in Zingtree to values in the Brand, Tags, or a custom field in a Zendesk ticket. For example, if a tree is tagged with “astrology”, and the ticket tags include “astrology”, then that tree appears. If several trees match, then they will all appear, and the agent can choose one.

To open a script based upon Brand:

  • Add tags to your trees for each brand you want to match. So if one of your brands is xyz.zendesk.com, use xyz as a tree tag in Zingtree for all the trees you want to show.
  • Make sure Match Tree Tags to Zendesk Brand is checked in the App Configuration.

To open a script based upon Zendesk ticket tags:

  • Add tags to your trees for each tag you want to match. So if one of your ticket tag possibilities is “billing”, use billing as a tree tag in Zingtree for all the trees you want to show.
  • Make sure Match Tree Tags to Zendesk Ticket Tags is checked in the App Configuration.

To open a script based upon a custom field:

  • Add tags to your trees for each possible custom field value you want to match. So if one of your custom field values is “billing”, use billing as a tree tag in Zingtree for all the trees you want to show.
  • Make sure the proper Zendesk field variable name is entered for  Match Tree Tags to values in a Custom Field is checked in the App Configuration.


Adding tags to a tree in Zingtree is done like this:

  1. Select a tree from My Trees.
  2. Go to the Settings tool.
  3. Enter or select a tag from the Tags field.

  4. Click Update Settings.

How to Configure to Update Ticket Fields

As agents navigate through your trees, their use of the decision tree scripts you create can automatically update any custom fields in that ticket. This can be done in two ways:

  • By clicking a button in a script
  • By entering data into Zingtree data entry fields.

The key is to use variable names in your Zingtree that match the ones used in Zendesk.

First of all, determine the names of the variables in Zendesk by clicking the Integration Setup Info link in the Agent Scripting app. You’ll see something like this:

You’ll see the label for the field as it appears in Zendesk’s ticket form, and the Zendesk variable next to it. In the above example, the Product custom field variable is custom_field_22899289. This is a drop-down selector, and the Zendesk values for the field options are astrology and insurance.

For the rest of this example, we’ll use custom_field_22899289 as the custom field variable.

To make a button selection update a custom field, you’ll set it up in your Zingtree as follows:

  1. Go to the Overview tool, and edit the node whose button selections will update the ticket.
  2. Click Edit Buttons (or Add Buttons if you don’t have any buttons defined). The button editor appears:

  3. Make sure Assign Button Click Variable is checked. This makes the other options appear.
  4. For the Button Click Variable, enter your custom field variable from Zendesk (custom_field_22899289 in the example).
  5. For each button option, enter the value of the variable under Score/Value. If this is a drop-down list in your Zendesk ticket, you’ll need to make sure the Score/Value entered matches one of the drop-down option values as shown in the Integration Setup Info.
  6. Click Save Changes when you’re done configuring buttons.

Bonus: Adding Tags via button clicks:

Button clicks can also add tags to a ticket. In the above example, clicking Something Else adds the tag other_tag to the ticket. Just include the tag name with two colons after the button text. So entering a button like Something Else::other_tag will add the tag other_tag to the ticket if this is clicked, but agents will only see Something Else as an option.

Using Zingtree Data Entry Fields to Update Tickets

Just like the above example, you can also use Zingtree for data entry, and have that data automatically transferred to your ticket. The key is to use the same variable name in Zingtree as you used in Zendesk. The Integration Setup Info link in the sidebar will give you those Zendesk variable names.

Example: If you have a text entry field in Zingtree you want to update into the Zendesk field custom_field_1234, you would set up the variable name as follows:

 

Try It with Example Data

You can use trees from the Zingtree Gallery to see how the Agent Scripting app works.

For a single tree, enter ’14’ as the Tree ID. This will show an Astrology website troubleshooter example.

For multiple trees, see how a tree can be selected by tag by doing the following:

  1. Enter 6a103737e44e4aa6e1e4b6b0bcb46f83 as the API key.
  2. Make sure Match Tree Tags to Zendesk Ticket Tags is checked.
  3. Try entering one or more of these tags into a ticket: “zingtree”, “astrology”, “pet_rock”.

Any questions? We’re always here to help

Decision Trees with Logic Nodes

In order to make decision trees that can help solve real-world problems, sometimes you need the ability to do more than just choose a path based upon a finite set of choices. For these reasons, we’ve introduced Logic Nodes into Zingtree.

In addition, we’ve found that many of our customer’s integrations are passing data variables into Zingtree, and there are situations where they would like to act on the value of those variables. Logic Nodes make this easy.

If you’re an existing Zingtree author, Logic Nodes replace Scoring Nodes from previous versions. Any tree that is using Scoring Nodes is automatically migrated to this new system, without losing any functionality or you having to do any updating of your trees.

Here’s How Logic Nodes Work

When you edit or create a Logic Node, you’ll see something like this:

Logic Nodes test the value of your Zingtree variables with a series of rules and jump to a node when a condition is met. The rules are applied in order, so once a rule condition is met, the node assigned to the rule opens next. You can also assign a default node to jump to in case no rules apply.

In the example above, if the variable fruit equals banana, then Zingtree will open node #8, the “Banana” node. If fruit is watermelon, then the default “Something Else” node opens.

About Variables

Variables can be numeric or text, and the comparisons work for either data type. You can bring variables into your trees in several ways:

Note: Your choice of variables is shown in a drop-down list. If Zingtree hasn’t encountered a variable yet in one of the above scenarios, then it won’t appear as an option.

Editing Rules

When editing your Logic Nodes, you can edit your rules as follows:

  • Reorder rules by dragging them up and down with this tool: Reorder Logic test
  • Delete a rule by clicking on this: Delete logic test
  • Select any existing variable from the Variables drop-down.
  • Select an operator (=, ≠, <, >, ≤, ≥ ).
  • Enter a value to perform the test upon.

You must also enter a default node to jump to if no conditions are met.

Zingtree Logic Nodes give your decision trees a bonus option for adding extra intelligence to your processes and troubleshooters. Do you have a cool application for Logic Nodes you’d like to share with us? Reach out and tell us your story!

This article was originally published on May 8, 2017.

Summer 2017 – Decision Tree Updates

This summer has seen a lot of improvements to Zingtree – both new features and updates. As part of our commitment to transparency, here’s what’s been changed since our last updates post:

New Features

Updates and Bug Fixes:

  • Update: Simple Overview shows tree ID in tree nodes
  • Fix: Content Editor: Pasting images inside an ordered or unordered lists no longer creates a new list. (Mark W., Antonio J.)
  • Update: New Browser tab graphics.
  • Fix: Deleting nodes now properly deletes attached data entry fields, webhook calls. (Soren)
  • Fix: Reimporting trees over previous tree now removes data entry fields from previous version. (Soren)
  • Fix: Pressing ENTER in date form field (or other fields) no longer shows “no tree specified” error. (Jay H.)
  • Update: Clicks and Usage report now includes info buttons for “Sessions Started” and “Sessions Clicked”. Because people have asked about this.
  • Fix: Changing custom CSS theme no longer changes look of Overview Thumbnails buttons.
  • Update: Cleaned up Zendesk Support app renderings for Q&A, All Data.
  • Update: Search in a tree, then back, no longer fails in Zendesk Agent Scripting app.
  • Update: Does date validation for specific formats (mm/dd/yy and dd/mm/yy). (Jay H, David R.).
  • UI: Added Import button to My Trees, removed some import options from Create Tree.
  • UI: More Tools is now organized better.
  • Fix: Generating transaction receipt no longer fails if no time zone set.
  • Fix: Tabs in gathered data no longer mess up Form Data report CSV export. (Mesam)
  • Update: Added Copy Organization option. (Ted B.)
  • Fix: Session Detail edit links now go to proper subtrees. (Lynne H.)
  • Update: Cleaned up file upload UI in Edit Node.
  • Fix: deploy/session-detail.php now shows questions / titles properly. (Alok)
  • Fix: Add/ Edit/Delete Collaborators now only updates rights on trees in the current organization. (Ted B.)
  • Update: added Tree ID and Node # to bottom of Agent Portal. (Sasha D.)
  • Fix: Pasting images now locates images in clipboard. Works better with SnagIt.
  • Fix: Empty fields (from visited nodes) now show up in form data. (for Ted B.)
  • Fix: validating multiple emails or phone numbers in a single form now shows status just on proper entry. (Jay H.)
  • Fix: validation badges for email, phone in placeholder mode now align properly. (Jay H.)
  • Fix: Designer no longer shows new override classes in labels.
  • Fix: Designer no longer incorrectly changes labels incoming to logic nodes.
  • Fix: Send custom email stock webhook now sets the reply-to properly. (Ted B.)
  • Update: Send Custom Email webhook can now handle multiple emails in the “to” field. (Ted B.)
  • Fix: Phone (tel) and email field types now properly autoload values from merge variables. (Jay H.)
  • Fix: Required fields with placeholders now have red asterisk and data entry field on the same line. (Jay H.)
  • UI: Edit tree node hides start node, return node when tree selection is unspecified or “return to previous tree”.
  • Update: Tree Node editor can now select a node to return to from a list.
  • Update: WP plug-in version 4.0 now supports pop-up buttons, multiple embeds on a page, and fixes scrolling issues.
  • Update: Creating a new organization can now automatically tie billing to existing org owned by Billing Admin or Super User.
  • Update: Super User now can manage billing Admin tasks as well. (Marc)
  • Update: Customer’s credit usage report shows Lookup Credits used (if any used).
  • Fix: Address, city, state and zip field types now properly autoload values from merge variables. (Jay H.)
  • Fix: Popup Overlay options now works properly when button text includes an apostrophe. (Albert D.)
  • Fix: Send Custom Email technique now manages line breaks in multiline text forms properly. (Nicola)

Got any bugs or suggestions? Please let us know!

Decision Tree Customizations – Animated Themes and Custom Colors

One of the most common requests we have had from customers is to make it easier to make Zingtree decision trees look even more awesome. So our design team and engineers worked together to make new animated themes, some colorful static themes, and an easy-to-use mechanism to make tree color customizations easy.

You can try this now on one of your existing decision trees, by clicking Set Colors in the Settings tool. If you don’t have a tree built yet, try it using one of our Gallery trees.

Once you launch Set Colors, you can choose from various themes, and also customize the color scheme used in each theme. The control panel is easy to use – it looks like this:

This video shows some of the capabilities:

Here are a couple of examples of what your decision trees can look like:

Default View with Panels

Animated Radio Buttons View with Panels

Advanced Customization – Technical Details

Zingtree’s theme and color customization scheme works by generating a CSS file, which controls how your decision tree appears. If you want even more customization, you can:

  1. Extract the CSS file that Zingtree builds – this is in the Custom CSS URL field in Settings. (Just open that URL in your browser.)
  2. Modify the file in any text editor.
  3. Upload the modified file to your own server. (Note that this file must be accessible via an https URL. If needed, we can host it for you. Just ask!)
  4. Enter the URL of the new file in the Custom CSS URL field in the Settings tool.

Like this? Love this? Have a suggestion to make customizations even better? Let us know!

Credits: Iggy made the animated themes, and McDeb did some tweaks and cleanup to make them work with our customization scheme. Great stuff, people!

Yonyx Alternative – Better Guided Customer Interactions with Zingtree

We often get requests from companies that have deployed decision trees in the past with Yonyx and are looking to migrate to Zingtree. These occur for some of the following reasons:

  • Zingtree offers a better price with our pay-for-what-you-use model.
  • Zingtree tools are more modern, and easier to use.
  • Zingtrees present better. Customers have more options to create the look and feel they envision, choose custom colors and button styles, use effects and transitions, and better match their branding.
  • Customers like Zingtree’s integrations capabilities more – specifically the Webhook system and Zapier integration.
  • And more…

In response, we’ve created an import tool to make it easy to migrate your Yonyx trees to Zingtree. You can test out your Yonyx trees in Zingtree, tweak them, and see for yourself how they render and perform.

Here’s how to import Yonyx decision trees into the Zingtree alternative:

  1. Export your Yonyx tree into XML.
  2. In Zingtree go to My Trees, and click Import.
  3. Pick Import from Yonyx XML file.
  4. Select the Yonyx XML file to import. It will be uploaded and converted into a fully functional Zingtree decision tree.

Are you looking to move from Yonyx? Tell us your story!

Upload File Attachments into Decision Tree Sessions

Many customers have asked for a way to include file uploads as a part of a Zingtree decision tree session. Some use cases include:

  • Attaching a screenshot.
  • Including a photo.
  • Uploading a document.

Overview

Using Data Entry Fields, you can pick the File Upload field type. This allows you to include one or more files in the session data gathered by Zingtree. When the end-user uploads a file, here’s what happens:

  1. The file is copied from the end-user’s computer to a Zingtree file storage server.
  2. Zingtree assigns a variable to the URL where the new file resides.

Security note: Each file uploaded has a random 7 digit prefix or session ID attached to it, so that files with the same name aren’t overwritten, and the file names cannot easily be discovered by hackers.

How It Works

When the end-user reaches a node with a file upload, they will see something like this:

Clicking Upload Document File allows them to choose a file on their computer. Once a file is chosen, the button changes:

How to Set up File Uploads

When editing a node, do the following:

  1. Go to Data Entry Fields, and select Add:

  2. Choose File Upload as the field type, and enter a variable name and label for the upload button:

  3. Click Add Field.
  4. Now click Save Changes to save changes in the node you were editing.

It’s that simple! This gallery example shows how a simple file upload tree is built.

If this is useful for you, let us know. We love customer stories!

Zingtree Enterprise: Self-Hosted Decision Trees

enterprise-BLOG

While we are highly focused on our own security and data integrity, we recognize that using a SaaS (Software as a Service) site like Zingtree may require approval from various departments. For many, the hosting of company data offsite immediately triggers a cautionary reaction.

To address these concerns, we have a completely self-hosted Zingtree version. It utilizes the same awesome tools found in Zingtree but packaged in a way that can be installed on any server with industry standard PHP and MySQL. A full source code license is included, as well as regular updates.

This self-hosted option has a lot of benefits:

  • Customer data remains on-site.
  • Data is not intermixed with other company’s data (in case of legal subpoena issues).
  • Full source code allows security specialists to inspect the code for any possible hacking loopholes.
  • The design and engineering teams can modify the code or design of Zingtree to their liking.
  • You can guarantee your own uptime.
  • Plus, we provide consulting, support and maintenance as requested.

Want to learn more about the self-hosted Zingtree Enterprise solution?

Please contact us with licensing questions, or to get started with your self-hosted Zingtree Enterprise solution.

This article was originally published on September 28, 2015, but the information is still just as relevant! 

Tree Nodes: How to Automatically Return to a Previous Decision Tree

Tree Nodes are one of Zingtree’s most popular decision tree building features. By allowing one tree to launch another, you can better organize your work and use smaller components repeatedly as a part of larger processes.

For example, a hardware company that makes lots of products may have a specific troubleshooting process for power-on problems that are common to many trees. By linking to a subtree, this troubleshooter can be authored just once, and used from several different trees.

A common request when implementing tree nodes is to be able to automatically return to the original decision tree that launched the process – just like a return statement in any programming language. This is done using a special type of tree node that is labeled as “return to previous tree.”

Summary: Setting Up a Return to a Previous Tree

Setting up a return tree node requires these steps:

  • Create a tree node in the starting tree, and specify a node number to return to.
  • In the subtree, use a tree node selected as return to previous tree. When this node is reached, the return node in the calling tree appears next.

Setup: Step by Step

  1. Create your starting tree and the subtree that will be launched from the starting tree.
  2. In the starting tree, create a tree node. Include the tree to launch, as well as a node in the starting tree that you want to return to when the subtree is finished (highlighted in red below). It looks like this when editing a tree node:

  3. In the subtree, create a new tree node and specify it as “return to previous tree.” Like this:

When the “return to previous tree” node is reached in the subtree, the return node from the starting tree will appear.

Example

The Zingtree Gallery has an example, both the starting tree and the subtree.

Thanks for Shawn G. and others for the inspiration!

Summer Updates: Pop-Up Overlays, Predefined Webhooks and More

We’ve been busy this summer – so much so that we haven’t had a chance to share all the great updates we’ve done in the last couple of months! So here’s a list of all the latest improvements to Zingtree:

  • New: Popup overlay option
  • Fix: Webhooks now run when added to root node
  • New: Pre-defined webhooks (Session Summary, Timestamp, Send Custom Email)
  • Fix: Phone number field type can now be set as ‘required” (Boruch)
  • Fix: Preview now shows agent / end-user views properly (Boruch)
  • Update: Sessions List report now paginates at 500 per page (Roman)
  • New: Send secure session data link in email node also now includes a link to reopen the session (Boruch)
  • Fix: Zendesk app Q&A now shows all button clicks, even when going through subtrees (Phillip R.)
  • Fix: Session detail report now shows subtree jumps properly (Phillip R.)
  • Fix: PHP API call for tree_sessions now recognizes tree_sessions operation.
  • New: Repeating Forms
  • Fix: Designer now properly saves absolute button click values (i.e. =3)
  • Fix: Agent logins with trailing space characters now work in Agent Portal
  • Fix: Designer now always shows root node properly
  • New: Search Terms report
  • Update: Added Copy to Clipboard button for iFrame embed advanced options
  • New: Timestamp stock webhook (for Abe in Japan)
  • Update: Cleaned up API documentation so section titles and calls properly matched
  • Update: Layout of My Agents page improved
  • Fix: Phone number verification now treats numbers starting with 1 as International style. Allows for easy verification of USA numbers entered starting with 1.
  • Update: Made margins smaller for embeds in mobile device.
  • New: added email validation option, phone number validation (Tom K., Alok)
  • Fix: Verified badges for address lookups now align with input forms
  • Fix: Address verification now looks better on smaller screen displays
  • Fix: Copying trees now also properly copies checkbox score values in data entry forms (Ana)
  • New: Added CSV export to All Tree Stats report.
  • New: USA Address auto-complete and verification system in place
  • Update: Increased max form fields to 50 (Jonathan K)
  • Update: Scoring nodes can now call webhooks
  • Update: Webhooks and apps no longer run asynchronously, so webhook data is available immediately upon node launch
  • Fix: Recovering trees from snapshots no longer duplicates form fields
  • Fix: Copying a tree saves new copy as first entry in snapshots, labels the copy event properly
  • Update: All tree Stats report shows totals in the last row (Diana T.), lets you select an organization
  • Fix: Thin line at top of embedded trees no longer appears (Josh S)
  • Update: Agent portal “Done with Customer” button now logs that as a button click in session logs
  • Fix: Plus signs in email addresses now get transferred properly via email-session-info link nodes.
  • Fix: Embed options now always uses https by default.
  • Fix: Publishing links cleaned up for https always.
  • Update: Custom CSS URLs are now forced to be https in Settings tool.
  • New: Data Totals report
  • Fix: Saving layouts with unlinked nodes in Designer no longer gives weird error messages
  • Fix: “Default Browser” as browser type broke Zendesk agent scripting app for some people
  • Fix: Redirecting from http to https didn’t work for some really long URLs. Including Zendesk Agent Scripting app.
  • Fix: Webhooks now handle URLs with variables with spaces properly
  • Update: Now forces https for all URLs
  • New: Added zt_browser as an enhanced location variable
  • Fix: Pressing restart button reloads enhanced location variables, merge variables
  • Update: Question field length now 500 characters (Julie C.)
  • Fix: Updated location data for higher volume lookups
  • Fix: Resetting button click variables on the first click now works properly.
  • Update: Export to CSV buttons now at top of each report page (for Josh)
  • New: Option to switch between running total and fixed value for button click scoring

Whew! That’s a lot of updates over the last two months.

Whenever possible, we give credit to the customer who suggested an improvement. So if you have a brilliant idea, a suggestion, or a real need, let us know and we’ll do our best to make it part of the next update.

Publishing Pop-Up Decision Trees

Zingtree makes it fun to include decision trees on your site by enabling them to appear on top of any page, simply by clicking a button. We call this publishing method a “pop-up overlay.” You can easily customize the button color, text, and look of the trees.

You can also include multiple trees on one page. Try these examples:

    

 

Here’s how to set up pop-up overlays:

  1. Click the My Trees button at the top of the screen.
  2. Choose the tree to embed.
  3. Select Publishing Links.
  4. Click Pop-up Overlay via Button Click.
  5. Copy the default button code to your web site, or click the Advanced Options button to do some cool customization.

Shortcut: Go here to create a button that launches a pop-up overlay for your tree.

We think this is yet another cool way to incorporate interactive decision trees into your web site. Do you like it? Or have a better idea?

Send us feedback and let us know what you think!