Skip to main content

Greetings from Dromo HQ!

This week we have a whole smorgasbord of exciting news to share with you.

No cons, only Pro

First of all, we have debuted our new Dromo Pro plan, which takes the place of the Growth and Scale plans in the Dromo lineup.

Dromo Pro is designed to be a flexible plan which will adapt to your needs, whether you are importing thousands of small files every month, a smaller number of large files, or anywhere in between.

Dromo Pro operates on the concept of credits. Credits are consumed by each completed production import based on the size of the imported data:

Row volumeCredits consumed
1 - 101 credit
11 - 1002 credits
101 - 1,0003 credits
1,001 - 10,0004 credits
10,000+5 credits

Dromo Pro includes 500 credits, and you can add more credits in increments of 100 to match your needs.

We think Dromo Pro is a great billing model to support any data importing use case.

You can find more information on our beautiful new website. There, you can also find some sneak peeks at our upcoming products that will be joining Dromo Pro.

A new dashboard to match

You may have also noticed that we released a completely overhauled dashboard! We redesigned the dashboard with an eye towards usability, and we think it doesn't look too shabby, either.

You can use your dashboard to find account information, review imports, and manage your Dromo plan.

We've got plenty more exciting updates to the dashboard coming soon. Stay tuned!

And a documentation glow-up

We've also been hard at work completely revamping our developer docs to be easy to use and navigate, comprehensive, and provide guidance for common complex use cases.

Whether you are just getting started with Dromo or adding an advanced data transformation to your import, the docs have an answer for you only a click away.

Have a look, and let us know if there is anything you would like to see in our docs.

It's been a busy few weeks at Dromo HQ, and we've got some great improvements for you!

Validate the complete dataset before finishing

Sometimes, you may have the need to validate the full imported dataset before the user finishes. For example, you may need to check that a certain total number of rows were imported. Or you may need to check to see if any duplicates have been added to your database since the import was started.

The new beforeFinish callback enables you to do just that. It runs after the user clicks "Finish" and immediately before the onResults callback. The callback receives the full data and metadata in the same format as the results callback. You can perform any final validation on the data, and if there are issues that need to be resolved, you can return the user to the Review step with an error message.

Find more details in the docs!

React to changes in bulk

One of the most powerful tools in the Dromo arsenal is the row hook, enabling you to build custom transformation and validation logic that operates on full rows, and which fire both at the start of the import process, and any time the user makes any changes.

Dromo now offers a variation on the row hook. It works very similarly, except that instead of firing once for every row on initialization and once for every row after a change, it will only fire once on initialization and once per change action, regardless of the number of rows that have changed.

We call it the bulk row hook. Instead of receiving and returning a single record, it receives an returns an array of records, allowing you to react to changes in bulk.

For example, if a user pastes 50 rows into the uploader, the bulk row hook will fire once with the 50 rows.

You can find more about bulk row hooks here!

More control over the data you send to Dromo

Dromo's backendSync setting has been superseded by a new backendSyncMode setting, giving you more control over what you send to Dromo's secure backend.

The backendSyncMode setting has three options:

  • DISABLED is equivalent to backendSync: false. With this setting, none of your data is ever sent to Dromo.
  • FULL_DATA is equivalent to backendSync: true. This enables all of the features that our secure backend offers -- notably the import data API.
  • MAPPINGS_ONLY is a new option, and finds a happy medium between the two existing backendSync options. With this backend sync mode, only your field mappings (imported column headers to schema fields) are sent to and stored on Dromo's servers. This enables you to use the autoMapHeaders feature. However, the full import data is not sent to Dromo's servers, preserving any data privacy requirements you may have.

The nitty-gritty on the new backendSyncMode can be found here.

Read-only fields

You can now define fields as read-only by adding the readOnly: true parameter to the field spec. These fields will be visually distinguished in the Review screen, and will not be editable by the user.

Read-only fields are great when you want to populate a value exclusively using a row hook, and you don't want the user to be able to change that value directly.

Frontend license key domain restriction

The frontend license key is what you use in your frontend to load the Dromo Uploader. It is a publishable and potentially public-facing key.

Dromo now enables you to restrict the domains which may use your organization's keys. These domains will be the only ones allowed to load the Dromo Uploader, when not in development mode.

You can find this setting on the Organization page of the Dromo Dashboard.

Bugs squashed 🐛

  • When a user performs an import using manual input, there would sometimes be a jumpy user experience if the data was entered on any row except for the first. Now the import starts with only the row that the user entered data on, no matter what.
  • The cancel callback would sometimes fire after a successful import. The cancel callback now only fires when the user cancels.
  • If initialData was supplied, and the Dromo importer was closed and then reopened, the initialData would be lost. It is now preserved across multiple opens.

You'll have to excuse the brief lull here on the Dromo Changelog – we've been hard at work on some big new features which we are very excited to announce today. Strap in, because Dromo just got dreamier!

Data types for your fields

One of our most requested features, the new field types make it easy to give your users a great import experience for numbers, dates, times, and emails. And you can rest assured that these values will end up in your results as clean, well-formatted values exactly as you need them.

Together with Dromo's existing string, select and checkbox field types, and our extensive set of validators, it has never been easier to implement Dromo in your application in a way that exactly matches your users expectations and your application's data requirements.

Allow us to introduce the new types in a bit more detail!


Number fields in action

Any time you are importing any kind of numeric value with Dromo, number fields are there for you.

Number fields automatically read the input data as a number, and add a validation error to the cell if the input can't be parsed as one.

When displaying numbers to the user, Dromo provides many useful presets out-of-the-box for you to show numeric values to the user in an intuitive format. These include percentages, integers, currencies, fixed precision values, and more. If none of the built-in presets suit you, you can make your own!

Numbers are output to the result JSON as (maybe you guessed it already) numbers. If you want to get the output as a string in a specific format, that's an option as well.

Date, datetime, and time

Date, datetime, and time fields

Date and time parsing is notoriously finicky, but we've cooked up a great solution for importing temporal values into your application.

Dromo now has three new field types to handle every situation: standalone dates, standalone times, and combined datetimes.

Dromo handles importing these values in a variety of common formats, and displays these values to the user using the locale that you specify. If you want to get even more detailed, you can easily define a format of your own.

Temporal values are output by default as ISO-8601 strings. Of course, that's customizable too!


You have googled "email regex" for the last time! Dromo now supports validating email addresses just by declaring a field as the new email type.

Email, checkbox and select fields

All of these new types join our existing field types: select fields for giving your user a pick list, checkbox fields for boolean values, and of course, the trusty old string field.

Detailed information for all of the types can be found on the Fields page of our documentation.

We're excited to see how you use the new types to make great import experiences for your users! As always, we'd love to hear your thoughts and ideas about fields, how they work for you, and how they could be even better.

Angular SDK

Joining our vanilla JS and React SDKs, we're pleased to announce the Dromo Angular SDK! This new package makes it easy to implement the Dromo Uploader in your Angular application.

The Angular SDK provides a component that you can simply drop in to your Angular app, and you can give your users a fantastic import experience in no time.

The Angular SDK is currently in beta, and we would love to hear from you if you would like to use it in your application.

Export error rows as CSV

Dromo makes it easy for your user to find and correct data errors in the import process. Sometimes, it's not feasible to correct the errors all at once. Now, when there are outstanding validation errors, Dromo provides the option to download all rows with errors as a CSV file.

Export error rows dialog

Your users can then fix the errors offline, and reimport the data when ready.

New API endpoint to list uploads

If you use the backendSync feature, Dromo now offers a new API endpoint to list all uploads stored by Dromo for your organization. This is great for checking you haven't missed a webhook or performing any periodic cleanup you may need to do.

The endpoint is at /api/v1/uploads/ and you can learn more in the docs!

Access to output values in row hooks

When a row hook runs (either at the start of the review step, or when a user changes data), you get access to all of the data in that row. Previously, we would just expose the data in the format shown to the user. Now, row hooks also have access to each cell's outputValue, which is the value exactly as it will appear in the results.

For example, if you have a date field with value: "1/19/1988", that field would now have an additional key, with outputValue: "1988-01-19".

Wow, that was a lot! It's a banner week here at Dromo, and we hope you find all of these improvements useful. We always want to hear from you: comments, questions, feedback, cries of disbelief, or just saying hi. Drop a line!

React to row deletions

On Dromo's review screen, your users have the opportunity to delete any rows that shouldn't be there by right clicking on a row and selecting "Remove row".

If you need to react to this situation programmatically, this is now possible with row delete hooks. As you might guess, they will fire any time a row is removed, with relevant information about the removed row.

Give your user the low-down during slow-running hooks

If you have hooks that do long-running tasks like accessing slow external APIs, sometimes you have no choice but to keep your user waiting while they run.

Now, you can provide your users with some context while your hooks are running at the beginning of the Review step. Just set the reviewStep.processingText setting to the message you want to show the user.

The processingText setting in action

More metadata about fields and headers

Hooks unlock the full power of Dromo, allowing you to deeply integrate the upload process into your app. We are always looking for ways to make them more powerful, and one common request was to have more context about the original file and how it was mapped.

The REVIEW_STEP and REVIEW_STEP_POST_HOOKS hooks as well as the onResults callback now provide you with comprehensive metadata about all of the fields that will be present in the results. As always, full information can be found in the docs.

Is there something you would like to see in the hooks? Let us know!

Opt out of fuzzy matching

When your user imports a file, we do our best to save them time by matching the file headers to the fields in your schema. As with all fuzzy matching, it's possible for these suggestions to sometimes be wrong.

If you have some critical column matching that is evading our matching algorithms, you can now opt out of the fuzzy matching functionality by setting matchingStep.fuzzyMatchHeaders to false.

Bugs squashed 🐛

  • The Dromo uploader will no longer show a warning to the user when they go back from the Review step if they have not changed any data
  • Fixed buggy behavior when attempting to automap a field that no longer exists in your schema
  • Improved behavior when making rapid edits in combination with slow-running row hooks

No need to map headers if they all match exactly

We love our intuitive interface for matching imported columns to your schema, but sometimes it's unnecessary -- like if your user took advantage of our template file functionality. 😎

Now, if all of the columns in an imported file exactly match the key, label, or alternate matches of every field in your schema, we will skip right past the column matching step and go directly to the review step.

Custom messages for invalid select options

We have always offered the ability to set custom error messages for our validators with the validator errorMessage property.

Now, we offer the same functionality for select fields, if the a value is imported that does not match the select options. You can use this by providing an invalidValueMessage with your select field.

The invalidValueMessage setting in action

Simplified sign-up flow

Previously, we asked for your first and last name on our registration page.

Now we keep it simple, and we only need an email and password for you to get started with Dromo.

We're always happy to get on a first name basis with you, regardless!

Bugs squashed 🐛

  • On the column matching screen, we label columns A-Z, just like your favorite spreadsheet program. Previously, things would get weird after the 26th column. Now, the count goes ... Y, Z, AA, AB, ... like you'd expect.
  • There were certain situations where our automatic character encoding detection would pick the wrong encoding. This has been fixed. Æbegone!

More options for dealing with unresolved errors

This week, we released a new configuration setting, invalidDataBehavior, to allow better control over how Dromo behaves when there is invalid data during the Review step.

As a refresher, a row is considered invalid if any of its fields have a failing validation or an "error"-level message that you have placed via a data hook.

The invalidDataBehavior replaces the allowInvalidSubmit setting, and gives you three options:

  • REMOVE_INVALID_ROWS, (the default) warns the user that there are invalid rows, and if they proceed, drops the rows with invalid data from the results.
  • INCLUDE_INVALID_ROWS also warns the user, and if they proceed, will include the rows with invalid data in the results. You can check the rowsWithErrors field on the results metadata to determine which rows had issues.
  • BLOCK_SUBMIT is the new behavior that this setting enables. With this enabled, users will not be able to complete the import until they have resolved all of the errors in the import.

Filename now available in onResults callback

In addition to the upload step hook, you can now access the filename of the user-uploaded file in the onResults callback. You will find it in the metadata object under the filename key.

Empty columns automatically dropped

If files are imported that have columns that are completely empty, Dromo will now ignore the columns, keeping the column matching screen free of clutter.